2016-08-15 18 views
-2

柔軟な配列を持ついくつかの構造体(版4.9.2。):なぜフレキシブル配列メンバーはstructの終わりでなければならないのですが、フレキシブル配列を持つstructはなぜですか?エラーなしでコンパイル</p> <pre><code>struct SomeArray { unsigned length; int array[]; }; </code></pre> <p>このコードはgcc:

struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1; 

どのようにこの作品?規格から

+0

gcc 4.8.2は、 'SomeArray'(' struct SomeArray'ではなく)が定義されていないため、コンパイルエラーが発生しました。 – MikeCAT

+0

「この機能はどうですか? - はい、どうですか?警告を有効にしてコンパイルしましたか? (私は間違いがあると思いますが) – Olaf

+0

うーん、GCC拡張のためにうまくいきますか? http://melpon.org/wandbox/permlink/23zsb6490RslWhV9 – MikeCAT

答えて

1

:特別な場合として

、複数の名前付き部材と構造体の最後の要素は、不完全な配列型を有していてもよいです。これはフレキシブルアレイメンバと呼ばれます。ほとんどの場合、配列メンバーは無視されます。特に、構造体のサイズは、可撓性アレイ部材が省略されているかのように、省略されているよりも多くの後続のパディングを有することがある。

これは、フレキシブルアレイメンバーが無視される状況の1つと考えられます。したがって、ss1.some_arrayのサイズには、ss1.some_array.arrayのスペースは含まれません。

+0

§6.7.2.1の¶3には特定の制約があります(同じセクションの¶18から引用します)。_A構造体または共用体には、不完全または関数型のメンバーが含まれていてはなりません(したがって、 構造体は複数の名前付きメンバ を持つ構造体の最後のメンバが不完全な配列型を持つ場合を除いて、それ自体のインスタンスを含みますが、インスタンス のインスタンスへのポインタを含む可能性があります。そのような構造体(およびおそらく を含む任意の共用体は、そのような構造体であるメンバー)は、構造体のメンバーでも、配列の要素でもないはずです。** ** Thou shalt not!** –

関連する問題