C 標準では「型の互換性」が定義されており、構造体の型が互換性を持つためには、他の基準の中でも特に、同じタグを使用する必要があります。構造は異なるタグを使用します — それらは本質的に異なるタイプです。
標準のいくつかの複雑な言葉遣いの仕様で、下品な詳細を見つけることができます。
ISO/IEC 9899:2011 §6.2.7 互換型と複合型
型が同じ場合、2 つの型には互換性のある型があります。2 つの型に互換性があるかどうかを判断するための追加の規則は、型指定子については 6.7.2 で、型修飾子については 6.7.3 で、宣言子については 6.7.6 で説明されています。55)さらに、別々の翻訳単位で宣言された 2 つの構造体、共用体、または列挙型は、それらのタグとメンバーが次の要件を満たしている場合に互換性があります。両方がそれぞれの翻訳単位内のどこかで完了する場合、次の追加要件が適用されます。対応するメンバーの各ペアが互換性のある型で宣言されるように、メンバー間に 1 対 1 の対応が必要です。ペアの一方のメンバーがアライメント指定子で宣言されている場合、もう一方は同等のアライメント指定子で宣言されています。ペアの一方のメンバーが名前で宣言されている場合、もう一方は同じ名前で宣言されます。2 つの構造体の場合、対応するメンバーは同じ順序で宣言する必要があります。2 つの構造体または共用体の場合、対応するビットフィールドは同じ幅でなければなりません。2 つの列挙の場合、対応するメンバーは同じ値を持つ必要があります。
55)互換性があるために、2 つのタイプが同一である必要はありません。
2 つのサンプル構造には異なるタグ ( struct A
、struct B
) があるため、明らかに互換性のある型ではありません。
2 番目の例では、2 つの匿名struct
型を使用します。
struct { int a, b; } func1();
void func2()
{
struct { int a, b; } var = func1(); //not allowed
}
標準の別の部分がこれに適用されます。
6.7.2.1 構造体および共用体指定子
¶8 struct-or-union-specifier に struct-declaration-list が存在すると、翻訳単位内で新しい型が宣言されます。struct-declaration-list は、構造体または共用体のメンバーの一連の宣言です。
参照するstruct-declaration-listは中かっこ{
…で囲まれた部分です}
。1 つの翻訳単位に 2 つあるため、2 つの型を宣言 (定義) するため、互換性がありません。
あなたの最後の例は、 C では新しい型を導入しないことtypedef int myOrangeInt;
をtypedef int myAppleInt;
示しています。typedef
別のタイプのシノニムを導入するだけです。この場合、myOrangeInt
は のシノニムでint
あり、 もmyAppleInt
同様であり、これらは同じ型のシノニムであるため、型は同じ型です。
§6.7.8 型定義
¶3 …typedef
宣言は新しい型を導入するのではなく、そのように指定された型のシノニムのみを導入します。…</p>