2

なぜこのようなものを使用できないのですか

struct
{
    int bar;
} Foo;

int main() {}

C++ モードの Comeau コンパイラでは、C モードではできるのでしょうか?

"ComeauTest.c"、4 行目: エラー: リンケージを持たない型を使用して、リンケージを持つ変数を宣言しています } Foo; ^

4

1 に答える 1

4

3.5:8あたり、

リンケージのない型は、外部リンケージを持つ変数または関数の型として使用してはなりません。ただし、次の場合を除きます
。 — エンティティに C 言語リンケージがある (7.5)、または
— エンティティが名前のない名前空間内で宣言されている (7.3.1)、または
—エンティティは ODR で使用されていない (3.2) か、同じ翻訳単位で定義されています。

これは (3.5:8 で) C++98 から緩和されていることに注意してください。

リンケージのない名前 [...] は、リンケージのあるエンティティーの宣言に使用してはなりません。

この規則の理由は、別の翻訳単位から変数を参照するには、その型を知る必要があるためです。これは、名前のない型では不可能です。実際には、これは、名前のない型では不可能な明確な名前を生成するために、外部リンケージを持つ変数がその型でマングルされるためです。

ただし、コードでは、エンティティFooは (おそらく) ODR で使用されておらず、最も確実に定義されているため、適合する C++11 コンパイラによって受け入れられる必要がありますが、Comeau はそうではありません。

于 2012-09-10T15:57:10.413 に答える