В книге Программирование на C: современный подход в главе 18 рассматриваются некоторые из наиболее технических особенностей деклараций. На странице 459 автор заявляет, что переменная в программе C имеет три свойства:
- Продолжительность хранения - (автоматический против статического)
- Область действия - (блок против файла)
- Связь - (внешняя vs внутренняя vs нет)
Я искал на нескольких разных веб-сайтах и на нескольких разных S.O. сообщений, но мне все еще трудно понять разницу между сферой и связями.
Одна из основных концептуальных трудностей, с которыми я сталкиваюсь, - это определение уникальной информации, которая предоставляется путем указания области действия переменной , которая еще не задана типом связи < / em>. Кажется, есть какие-то нюансы, которые мне совершенно не хватает.
Рассмотрим следующие примеры объявлений переменных:
Дело 1:
void foo(void)
{
static int j; /* block scope + no linkage */
}
Случай 2:
int i; /* file scope + external linkage */
int main(void)
{
.
.
.
}
Случай 3:
static int i; /* file scope + internal linkage */
int main(void)
{
.
.
.
}
Если вы посмотрите на 3 случая, вы увидите, что пары области видимости блока без связи и пары области видимости файла с внутренней или внешней связью.
Поэтому я не вижу информации, которая добавляется путем указания области действия. То есть:
- Если я знаю, что у переменной есть функция без привязки, то я знаю, что тип области видимости должен быть блочным.
- Если я знаю, что переменная имеет функцию внутренняя связь или внешняя связь, то я знаю, что тип области действия должен быть файлом.
Я не знаком с кодом, который использует блок с внутренней связью. Я не знаком с кодом, который использует блок с внешней связью. Наконец, я не знаком с кодом, который использует область файла без привязки.
Кажется, что тип связи предоставляет всю необходимую информацию ... так в чем именно заключается область действия?
Спасибо!
Редактировать:
Иными словами, эти термины не являются независимыми (есть определенные комбинации, которых просто не существует, по крайней мере, так кажется).
Вот картинка, которая, как мне кажется, правильно передает идею: