Подтвердить что ты не робот

Концепция области имен типов в C11

Стандарт ISO C11 (у меня есть только доступ к черновику версии, n1570.pdf), указывается в 6.2.1.8 (такого стандарта нет в стандарте C99):

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

Я ищу любое объяснение:

1) Название раздела (6.2.1) - "Области идентификаторов". Формулировка этого параграфа для меня неясна: является ли "область имен типов" своего рода областью, аналогичной, например, область видимости блока, объем файла и т.д.? Или это область самого имени типа (в этом случае еще один вопрос: каким образом объект без имени имеет область действия и что может быть использовано для такой области).

2) Где это определение имеет значение? Более конкретно, если бы оно было изменено, чтобы сказать, что область имени типа начинается сразу после завершения соответствующего имени типа, что это повлияет? Единственными токенами, которые могут следовать за пропущенным идентификатором в абстрактном declarator (= имя типа), являются несколько скобок и список имен параметров или размеры массива (с внутренними выражениями), ни один из которых не может ссылаться на указанное имя типа, поскольку существует нет идентификатора ссылки. Почему бы не дождаться завершения декларатора?

4b9b3361

Ответ 1

Эта формулировка является предметом Отчет об ошибках № 341: [*] в абстрактных деклараторах, в котором обсуждается проблема, которая в стандартном типе C99 -name не имеет области видимости, но область видимости требуется в некоторых случаях, поэтому C99 требует исправления. В отчете о дефектах говорится (внимание мое):

6.7.5.2 # 4 говорит, что * как размер массива "может использоваться только в объявлениях с областью прототипа функции", а в параграфе 5 говорится: "Если размер является выражением, которое не является целочисленным постоянным выражением: если это происходит в объявлении в области прототипа функции он обрабатывается так, как если бы он был заменен на *".

Но - это имя типа в прототипе функции декларации, и имеет ли она область действия прототипа? Области определены только в 6.2.1 для идентификаторов, и такие имена типов не объявляют идентификаторы. Наличие [*] в синтаксисе абстрактных деклараторов предполагает, что

void f(int (*)[*]);

должен был быть действительным и void f (int (*) [a]); должен был быть эквивалентен ему, но нет никаких заявлений в области действия прототипа функции. [...]

текущая формулировка - это разрешение этой проблемы, комментарии включают следующее:

Похоже, что проблема связана с тем, что имя типа не является объявлением и не объявляет идентификатор, и из-за этого у него нет области действия. Вместо добавления сложных формулировок избегайте использования термина "область действия", как предлагается в DR, он кажется более ясным, чтобы изменить определение области действия таким образом, чтобы оно применялось к типу, которое описано в 6.7.6 как "синтаксически декларация для функции или объекта такого типа, который опускает идентификатор".

это также влияет на формулировку в параграфе 6.7.5.2, который изменяет фразу из:

[...] объявления с областью прототипа функции [...]

в

[...] объявления или имена типов с областью прототипа функции [...]