Я только что отредактировал свой ответ; Я думал с точки зрения степени, а не объема. Тем не менее, я все еще думаю, что вы объединяете понятия, которые не следует объединять, но мне не хватает умения точно объяснить, почему.

фикация 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 в любом случае, тогда? Дальнейшая цитата (подчеркните мою):

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

Один и тот же идентификатор может обозначать разные объекты в разных точках программы.

Для каждого отдельного объекта, который обозначает идентификатор, идентификатор является видимым (то есть может использоваться) только в пределах области текста программы, называемой ее областью действия.

Если мы говорим, что член структуры не имеет области видимости, то он не виден и поэтому не может быть использован. Но, очевидно, мыМожно использовать членов структуры. Я что-то упустил?

Ответы на вопрос(1)

Ваш ответ на вопрос