2017-02-19 10 views
1

Я пишу собственный парсер C99. Я получил грамматику от ссылки this. Эта грамматика говорит следующее является допустимым синтаксисом для объявления массивов -Что означает звездочка внутри квадратной скобки объявления массива в C

int arr[*]; 

Соответствующая часть грамматики follwing -

direct-declarator ::= 
    identifier 
    "(" declarator ")" 
    direct-declarator "[" type-qualifier-list? assignment-expression? "]" 
    direct-declarator "[" "static" type-qualifier-list? assignment-expression "]" 
    direct-declarator "[" type-qualifier-list "static" assignment-expression "]" 
    direct-declarator "[" type-qualifier-list? "*" "]" 
    direct-declarator "(" parameter-type-list ")" 
    direct-declarator "(" identifier-list? ")" 

Я попытался компиляции кода с этой декларацией с использованием GCC. Он дал мне следующее предупреждение -

error: ‘[*]’ not allowed in other than function prototype scope

Так что я попытался объявить прототип функции с этим типом синтаксиса и скомпилирован без каких-либо ошибок или предупреждений. То, что я не получаю, может означать, что этот синтаксис может означать семантически. Любой эксперт с объяснением?

+0

Это просто явный способ выразить, что никакое значение не передается для этого измерения массива. (вы всегда должны указывать последние, но предшествующие размеры необязательны) (это ссылка, которую я искал) –

+0

, возможно, прочитал остальную часть стандарта, если вы собираетесь написать парсер? –

ответ

2

Это декларатор для массива переменной длины с неопределенным размером. Furhtermore, следующее объявление

void func(size_t n, char s[n]); 

эквивалентно просто написать:

void func(size_t n, char s[*]); 

выше особенно полезна для написания заголовков, где вы обычно декларируют только типы параметров

void func(size_t, char [*]);