Я только что отредактировал свой ответ; Я думал с точки зрения степени, а не объема. Тем не менее, я все еще думаю, что вы объединяете понятия, которые не следует объединять, но мне не хватает умения точно объяснить, почему.
фикация 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
в любом случае, тогда? Дальнейшая цитата (подчеркните мою):
Идентификатор может обозначать объект; функция; тег иличлен структуры, объединение или перечисление; имя определения типа; название ярлыка; имя макроса; или параметр макроса.
Один и тот же идентификатор может обозначать разные объекты в разных точках программы.
Для каждого отдельного объекта, который обозначает идентификатор, идентификатор является видимым (то есть может использоваться) только в пределах области текста программы, называемой ее областью действия.
Если мы говорим, что член структуры не имеет области видимости, то он не виден и поэтому не может быть использован. Но, очевидно, мыМожно использовать членов структуры. Я что-то упустил?