2017-01-26 1 views
1

C가 빈 선언을 허용하는 이유는 무엇입니까? 둘 다 문법 수준에서 명시 적으로 허용되며 컴파일 된 경우에만 경고를 생성합니다.빈 선언이 허용되는 이유는 무엇입니까?

C 표준의 부록 A에서 생산 declaration은, 문법 수준에서 허용된다 (내게로 EBNF으로 전환)

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

+0

유용하기 때문에? 'struct tagS {int x; };'공식적으로 빈 선언? –

+1

어떤 표준 버전을보고 계십니까? C11은 두 번째 및 세 번째 옵션 만 표시합니다. – dbush

+0

@BenVoigt 맞다! 예, 공식적으로 빈 선언입니다. 구조체는 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

관련 문제