В какой области находится идентификатор члена структуры? - PullRequest
6 голосов
/ 11 марта 2011

В спецификации 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. Я что-то упустил?

Ответы [ 4 ]

5 голосов
/ 11 марта 2011

Как сказано в стандарте, он находится в отдельном пространстве имен, созданном для типа struct. Это правило было добавлено в C89, я думаю. Когда-то давно , все имена членов разделяли одно пространство имен.

Может быть, автор компилятора был педантичным; пространство имен отличается от scope . Определение struct не вводит область видимости, поскольку не содержит переменных; это держит участников.

0 голосов
/ 11 марта 2011

Область действия и пространство имен - это две совершенно разные концепции, и их не следует путать.

экземпляр структурыили у union есть область действия, а у отдельных имен членов нет;понятие области просто не относится к ним.

Argh, я думал с точки зрения степени, а не объема.

0 голосов
/ 11 марта 2011

x находится в области, созданной struct A, но A находится в глобальной области. Это то, что «спецификация» называет областью действия файла, но имя вводит в заблуждение, потому что все файлы, которые вы включаете, совместно используют эту область.

0 голосов
/ 11 марта 2011

Я думаю, что в данном случае это относится к области A. Вы ссылаетесь на член SomeA.x, где SomeA относится к типу A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...