为什么我们不能使用这样的东西
struct
{
int bar;
} Foo;
int main() {}
在C ++模式下的Comeau编译器中,在C模式下我们可以吗?
“ComeauTest.c”,第4行:错误:使用没有链接的类型 声明一个变量 与联系} Foo; ^
答案 0 :(得分:4)
每3.5:8,
没有连接的类型不得用作具有外部连接的变量或函数的类型,除非
- 实体具有C语言链接(7.5)或
- 实体在未命名的命名空间(7.3.1)或
中声明 - 该实体不使用(3.2)或在同一翻译单元中定义。
请注意,这是从C ++ 98中放宽的,它具有(在3.5:8中):
不带链接的名称不得用于声明具有链接的实体。
此规则的原因是,为了从另一个翻译单元引用变量,您需要知道其类型,这对于未命名的类型是不可能的。实际上,这是因为具有外部链接的变量是 mangled 及其类型,以生成明确的名称,这对于未命名的类型是不可能的。
但是,在你的代码中,实体Foo
(可以说)并没有使用,并且大多数都是定义的,因此它应该被符合C ++ 11的编译器所接受,而Comeau则不然。 / p>