В спецификации C написано
Существует четыре вида областей действия: функция, файл, блок и прототип функции.
Теперь, если я сделаю следующее вне любой функции
struct A {
int x;
};
Насколько я понимаю, идентификатор x
виден в области видимости файла. И что мы используем синтаксис пространства имен для доступа к члену, как сказано в спецификации
каждая структура или объединение имеет отдельное пространство имен для своих членов (неоднозначное по типу выражения, используемого для доступа к члену через оператор. Или ->)
Давайте сделаем это более понятным, добавив функцию
struct A {
int x;
};
void f(void) {
int i;
}
Тогда идентификаторы, области и пространства имен, участвующие в представлении этой программы, (N / A "не применимо"):
file scope
==========================================
Ordinary | Members A | Tags | Labels
------------------------------------------
f | x | A | N/A
| | |
function scope of f
=========================================
Ordinary | Members ? | Tags | Labels
-----------------------------------------
N/A | N/A | N/A |
| | |
block scope #1
=========================================
Ordinary | Members ? | Tags | Labels
-----------------------------------------
i | | | N/A
| | |
И иерархия области видимости: «область видимости блока № 1» -> «область действия функции f» -> «область видимости файла».
Однажды я разговаривал с автором компилятора Си, и он сказал, что x
не входит ни в какую сферу. Может кто-нибудь объяснить, как это будет работать? Как мы вообще можем ссылаться на x
? Дальнейшая цитата (подчеркните мою):
Идентификатор может обозначать объект; функция; тег или член структуры , объединения или перечисления; имя определения типа; название ярлыка; имя макроса; или параметр макроса.
Один и тот же идентификатор может обозначать разные объекты в разных точках программы.
Для каждого отдельного объекта, который обозначает идентификатор, идентификатор является видимым (то есть может использоваться) только в пределах области текста программы, называемой ее областью действия.
Если мы говорим, что член структуры не имеет области видимости, то он не виден и поэтому не может быть использован. Но очевидно, что мы можем использовать элементы struct. Я что-то упустил?