2017-01-26 3 views
1

Почему C разрешает пустое объявление? Они оба явно разрешены на уровне грамматики и генерируют предупреждение только при компиляции.Почему допустимы пустые объявления?

Производство declaration, из Приложения А стандарта С, что позволяет ему на уровне грамматики:

declaration 
    = declaration_specifiers , ";" 
    | declaration_specifiers , init_declarator_list , ";" 
    | static_assert_declaration 
    ; 

(превратился в EBNF мной)

+0

Потому что они полезны? Это не 'struct tagS {int x; }; 'формально пустое объявление? –

+1

Какую версию стандарта вы смотрите? C11 показывает только второй и третий варианты. – dbush

+0

@BenVoigt Справа! Да, это формальная декларация. structs обрабатываются исключительно как спецификатор declaration_specifiers => type_specifier => struct_or_union. – Leandros

ответ

3

C не допускает пустых деклараций. См. https://stackoverflow.com/a/33273777/103167

Но это разрешает декларации без каких-либо деклараторов, только спецификаторы, если эти спецификаторы создают тег типа. Например:

/* here begins the specifier */ 
struct tagS /* <-- there's the tag */ 
{ 
    int x; 
} /* here ends the specifier */ 
/* no declarators */ 
; 

Это совершенно полезный и законный способ определения структуры пользовательского типа.

И поэтому грамматика должна указывать список деклараторов как необязательный.

+0

Мое замешательство возникло не из объявления структуры, а из факта, что просто 'int;' является допустимым объявлением. – Leandros

+0

@Leandros: Недействительно, поскольку он не имеет ни декларатора, ни тега, ни определяет каких-либо элементов перечисления. См. Связанный ответ. –

+1

Не будучи действительным семантически, он действителен на уровне грамматики. – Leandros

Смежные вопросы