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) 中声明,或
— entity 不是 odr-used (3.2) 或在同一个翻译单元中定义的。

请注意,这是从 C++98 放宽的,它具有(在 3.5:8 中):

不带链接的名称 [...] 不得用于声明具有链接的实体。

这条规则的原因是,为了从另一个翻译单元引用变量,您需要知道它的类型,这对于未命名的类型是不可能的。在实践中,这是因为具有外部链接的变量与它们的类型一起被破坏以生成一个明确的名称,这对于未命名的类型是不可能的。

但是,在您的代码中,实体Foo(可以说)没有被 odr 使用,并且最肯定是定义的,因此它应该被符合 C++11 的编译器接受,而 Comeau 不是。

于 2012-09-10T15:57:10.413 回答