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

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

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

Я ищу какое-либо объяснение следующего:

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

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


person alexsh    schedule 10.03.2014    source источник
comment
+1 То, что вы нашли время проанализировать цитату в стандарте, является достаточной причиной для голосования по этому поводу.   -  person WhozCraig    schedule 11.03.2014
comment
К вашему сведению: формулировка в ISO / IEC 9899: 2011 §6.2.1 ¶8 идентична тому, что вы цитируете.   -  person Jonathan Leffler    schedule 11.03.2014
comment
Я не уверен, но относится ли эта формулировка к struct xyz { ... };, которое является именем типа (struct xyz), которое не является объявлением идентификатора? Считается, что область видимости находится от точки с запятой до конца охватывающей области (файл, если он появляется вне какой-либо функции; блок, если он появляется внутри функции).   -  person Jonathan Leffler    schedule 11.03.2014
comment
Что ж, область видимости xyz в этом случае начинается прямо перед { (или сразу после xyz во втором случае), тогда как рассматриваемая формулировка относится к области, которая будет начинаться после `} '. Приведенный ниже ответ, относящийся к DR341, - это то, что я искал. Спасибо за помощь!   -  person alexsh    schedule 11.03.2014


Ответы (1)


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

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

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

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

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

текущая формулировка является решением данного вопроса, комментарии включают следующее:

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

это также влияет на формулировку в разделе 6.7.5.2 абзаца 4, который меняет фразу с:

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

to:

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

person Shafik Yaghmour    schedule 11.03.2014
comment
В своем последнем комментарии вы имели в виду 6.7.6.2 (4)? Большое спасибо за объяснение! Я искал подходящий DR, но безуспешно. Спасибо еще раз. - person alexsh; 11.03.2014
comment
@alexsh это 6.7.5.2 в черновике C99 и 6.7.6.2 в черновике C11. Также полезен предыдущий вопрос. ссылки на проекты стандартов. - person Shafik Yaghmour; 11.03.2014
comment
Еще раз спасибо, смотрел на C11. - person alexsh; 11.03.2014
comment
@alexsh без проблем, это развлечение для меня. Мне нравятся вопросы, которые заставляют меня думать. Хотя иногда на эти языковые вопросы юриста нет удовлетворительных ответов. - person Shafik Yaghmour; 11.03.2014