При попытке реализовать парсер C11 (для образовательных целей) я обнаружил, что в C11 (стр. 470), но также и в C99 (стр. 412) (спасибо Johannes!), прямой декларатор определяется как:
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
Сначала я думал, что это ошибка в грамматике (список типов не должен быть необязательным). Однако, когда я попробовал это в своем ссылочном компиляторе (clang), я получил довольно неожиданную ошибку:
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
По-видимому, (в clang) это называется модификатором звезды.
Я быстро понял, что их можно использовать только в сигнатурах функций:
void foobar(int array[*])
Однако они могут использоваться только в объявлении. Попытка использовать его в определении функции также приводит к ошибке:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
Итак, насколько я могу судить, предполагаемое поведение - использовать [*]
в объявлении функции, а затем использовать определение функции в определении функции.
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
Однако я никогда не видел его, и я не совсем понимаю его цель.
- Какова его цель, почему она была добавлена?
- Какая разница с
int[]
? - Какая разница с
int *
?