Просто я искал что-то в ISO/IEC9899. Когда я наткнулся на это:
6.7.6 Имена типов
[...]
Семантика
2 В нескольких контекстах необходимо указать тип. Это выполняется с использованием типа имя, которое является синтаксически объявлением для функции или объекта этого типа, который опускает идентификатор .128) 3 ПРИМЕР Конструкции
(a) int
(b) int *
(c) int *[3]
(d) int (*)[3]
(e) int (*)[*]
(f) int *()
(g) int (*)(void)
(h) int (*const [])(unsigned int, ...)
name соответственно типы (a) int, (b) указатель на int, (c) массив из трех указателей на int, (d) указатель на массив из трех ints, (e) указатель на массив переменной длины неопределенного числа ints, (f) function без спецификации параметра, возвращающей указатель на int, (g) указатель на функцию без параметров возвращающий int и (h) массив неопределенного числа постоянных указателей на функции, каждый с одним параметр, который имеет тип unsigned int и неопределенное количество других параметров, возвращая внутр.
Что меня больше всего смутило:
(e) указатель на массив переменной длины неопределенного числа ints
Другие, которые я могу понять более или менее. Но каково использование указателя на VLA неуказанного числа "ints"?
И есть ли необходимость в компиляторе для поддержки синтаксиса
int foo[*];
?
EDIT для уточнения
Этот вопрос primaly нацелен на "Требуется ли вообще поддерживать это для компилятора?".
В то время как эта запись ANSI-C грамматики - объявления массива, подобные [*] et alii, явно улучшили мои знания. По-прежнему нет ответа: почему компилятор должен знать, является ли параметр прототипа просто адресом, который содержит неизвестный размер. как с просто выполнением int foo[]
, или это будет неопределенный размер?
Итак, действительно ли это необходимо для поддержки? И если не так, почему стандарт даже реализует эту семантику?