2017-01-26 15 views
1

Cが空の宣言を許可するのはなぜですか?両方とも文法レベルで明示的に許可されており、コンパイルされた場合にのみ警告を生成します。空の宣言はなぜ許可されますか?

生産declaration、C規格の附属書Aから、文法レベルでそれを可能にされている:

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

(MEによってEBNFになっ)

+0

有用なので'struct tagS {int x;}ではありません。 }; '正式に空の宣言? –

+1

あなたはどの標準規格を見ていますか? C11には2番目と3番目のオプションのみが表示されます。 – dbush

+0

@BenVoigt Right!はい、正式には空の宣言です。構造体は、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