Comeau编译器中未命名的结构

时间:2012-09-10 15:49:36

标签: c++ c

为什么我们不能使用这样的东西

struct
{
    int bar;
} Foo;

int main() {}

在C ++模式下的Comeau编译器中,在C模式下我们可以吗?

  

“ComeauTest.c”,第4行:错误:使用没有链接的类型   声明一个变量             与联系} Foo;       ^

1 个答案:

答案 0 :(得分:4)

每3.5:8,

  

没有连接的类型不得用作具有外部连接的变量或函数的类型,除非
   - 实体具有C语言链接(7.5)或
   - 实体在未命名的命名空间(7.3.1)或
中声明    - 该实体不使用(3.2)或在同一翻译单元中定义。

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

  

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

此规则的原因是,为了从另一个翻译单元引用变量,您需要知道其类型,这对于未命名的类型是不可能的。实际上,这是因为具有外部链接的变量是 mangled 及其类型,以生成明确的名称,这对于未命名的类型是不可能的。

但是,在你的代码中,实体Foo(可以说)并没有使用,并且大多数都是定义的,因此它应该被符合C ++ 11的编译器所接受,而Comeau则不然。 / p>