なぜこのようなものを使用できないのですか
struct
{
int bar;
} Foo;
int main() {}
C++ モードの Comeau コンパイラでは、C モードではできるのでしょうか?
"ComeauTest.c"、4 行目: エラー: リンケージを持たない型を使用して、リンケージを持つ変数を宣言しています } Foo; ^
3.5:8あたり、
リンケージのない型は、外部リンケージを持つ変数または関数の型として使用してはなりません。ただし、次の場合を除きます
。 — エンティティに C 言語リンケージがある (7.5)、または
— エンティティが名前のない名前空間内で宣言されている (7.3.1)、または
—エンティティは ODR で使用されていない (3.2) か、同じ翻訳単位で定義されています。
これは (3.5:8 で) C++98 から緩和されていることに注意してください。
リンケージのない名前 [...] は、リンケージのあるエンティティーの宣言に使用してはなりません。
この規則の理由は、別の翻訳単位から変数を参照するには、その型を知る必要があるためです。これは、名前のない型では不可能です。実際には、これは、名前のない型では不可能な明確な名前を生成するために、外部リンケージを持つ変数がその型でマングルされるためです。
ただし、コードでは、エンティティFoo
は (おそらく) ODR で使用されておらず、最も確実に定義されているため、適合する C++11 コンパイラによって受け入れられる必要がありますが、Comeau はそうではありません。