Ответ 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
, который изменяет фразу из:
[...] объявления с областью прототипа функции [...]
в
[...] объявления или имена типов с областью прототипа функции [...]