Какую информацию предоставляет тип области видимости переменной, которая еще не описана типом связи переменной?

В книге Программирование на C: современный подход в главе 18 рассматриваются некоторые из наиболее технических особенностей деклараций. На странице 459 автор заявляет, что переменная в программе C имеет три свойства:

  1. Продолжительность хранения - (автоматический против статического)
  2. Область действия - (блок против файла)
  3. Связь - (внешняя 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 случая, вы увидите, что пары области видимости блока без связи и пары области видимости файла с внутренней или внешней связью.

Поэтому я не вижу информации, которая добавляется путем указания области действия. То есть:

  1. Если я знаю, что у переменной есть функция без привязки, то я знаю, что тип области видимости должен быть блочным.
  2. Если я знаю, что переменная имеет функцию внутренняя связь или внешняя связь, то я знаю, что тип области действия должен быть файлом.

Я не знаком с кодом, который использует блок с внутренней связью. Я не знаком с кодом, который использует блок с внешней связью. Наконец, я не знаком с кодом, который использует область файла без привязки.

Кажется, что тип связи предоставляет всю необходимую информацию ... так в чем именно заключается область действия?

Спасибо!

Редактировать:

Иными словами, эти термины не являются независимыми (есть определенные комбинации, которых просто не существует, по крайней мере, так кажется).

Вот картинка, которая, как мне кажется, правильно передает идею:

Иерархия связей


person S.Cramer    schedule 14.09.2020    source источник
comment
stackoverflow.com/ questions / 26580038 /   -  person user10191234    schedule 15.09.2020
comment
@ user10191234, это на самом деле одно из сообщений, которые я прочитал до того, как задать этот вопрос. Я не получил ответа, на который надеялся. Ссылаясь конкретно на МОЙ вопрос, не могли бы вы предоставить пример кода, который имеет область действия файла без привязки или область блока с внутренней / внешней связью? Если нет, то мой вопрос остается.   -  person S.Cramer    schedule 15.09.2020
comment
Вижу только один явный вопрос. какова точка охвата? Частично область действия означает диапазон видимости и продолжительность жизни, и, будучи осведомленным о концепции, он позволяет разделение, которое, в свою очередь, может обеспечить ограниченную или проецировать глобальную видимость и сохранение памяти. (То есть ограниченный ресурс автоматики и т. Д.). Статическая связь по-прежнему обеспечивает ограниченную видимость, а также продлевает срок службы до конца выполнения, обеспечивая собственный набор преимуществ.   -  person ryyker    schedule 15.09.2020
comment
@ryyker Суть моего вопроса (наиболее важным явным вопросом является вопрос, встроенный в заголовок) заключается в том, что область, на мой взгляд, кажется свойством типа связи, а не свойством переменной ... так что способ, которым эта концепция, которой обычно учат, кажется мне немного неправильной. И конечно ... тип связи - это свойство переменной, и поэтому вы можете рассматривать область как тип свойства этой переменной ... но это более отдаленное свойство переменной.   -  person S.Cramer    schedule 15.09.2020
comment
Считаете ли вы это внешним (проще, чем сказать «дистальным») по отношению к переменной или нет, область видимости переменных является важным свойством. Именно с этой переменной на протяжении всей своей жизни.   -  person ryyker    schedule 15.09.2020
comment
@ryyker Я думаю, вы неправильно поняли, что я имел в виду под дистальным. Я приложил к своему сообщению фотографию, которая проясняет путаницу. Я хочу сказать, что то, как автор преподает эти 3 концепции (продолжительность хранения, объем и связь), вводит в заблуждение.   -  person S.Cramer    schedule 15.09.2020


Ответы (1)


Хотя существует связь между областью действия и связью, они представляют собой две отдельные концепции.

Кроме того, стандарт C определяет четыре различных области действия идентификаторов:

  • Файл
  • Блокировать
  • Функция
  • Прототип функции

Это указано в разделе 6.2.1p2 стандарта стандарта C:

Для каждой отдельной сущности, которую обозначает идентификатор, идентификатор видим (т. Е. Может использоваться) только в пределах области текста программы, называемой ее областью действия. Различные объекты обозначают d одним и тем же идентификатором, либо имеют разные области действия, либо находятся в разных пространствах имен. Существует четыре вида областей действия: функция, файл, блок и прототип функции. (Прототип функции - это объявление функции, которая объявляет типы ее параметров.)

Единственные идентификаторы, которые имеют область действия, - это метки. Метка может содержать ссылки в любом месте функции, где она была объявлена.

Идентификаторы с прототипом функции - это параметры функции, которые появляются в объявлении функции. Например:

void foo(int x);   //  x has function prototype scope

Для идентификаторов с областью действия функции или областью действия прототипа функции они не представляют объект. Тогда в этих случаях идентификатор не имеет связи. В разделе 6.2.2p6 говорится:

Следующие идентификаторы не связаны: идентификатор, объявленный чем-либо, кроме объекта или функции; идентификатор, объявленный параметром функции; идентификатор области блока для объекта, объявленного без спецификатора класса хранения extern

Итак, чтобы ответить на ваш вопрос, привязка идентификатора не подразумевает его объем. Идентификатор без привязки может иметь область действия блока, область действия функции или область действия прототипа функции.

person dbush    schedule 15.09.2020