内部和外部结构的符号冲突,C ++与C

所以,假设我有以下C ++标头testheader.h

 struct mystruct { struct myinnerstruct { int x; } astruct; }; struct myinnerstruct { int x; }; 

和以下C ++源代码test.cpp

 #include "testheader.h" using namespace std; int main() { return 0; } 

g ++在编译/链接期间没有任何问题。

现在,如果我有相同的头,而不是C ++源代码,那么C源文件test.c

 #include "testheader.h" int main() { return 0; } 

我用gcc编译,我收到以下错误:

 error: redefinition of struct myinnerstruct 

那么,我认为C版本的范围是翻译单元,而C ++版本是块作用域? 有人可以证实这是事实,也许可以告诉我为什么它有意义? 我正在做一些C和C ++代码的混合,这给我带来了很多麻烦。

非常感谢任何见解。 谢谢!

在C嵌套结构中实际上并不存在于父对象范围内。 但是在C ++中,他们teststruct::innerstruct是一种与innerstruct不同的类型。 这是为了改进C ++代码中的封装。 如果没有这个规则,同一个命名空间中没有两个类型可以定义一个嵌套的iterator类,例如,这将是非常糟糕的。

C以其他许多非常愚蠢的方式对待结构,因此他们在这里做错了也就不足为奇了。 但是,C不允许类型作用域,并且在这里有一个合理的规则会为语言引入许多其他概念 – 最终,它需要引入namespace s,由于某种原因从未进行过。

在C中,内部结构的定义超出了外部结构,而在C ++中并非如此。

这篇博客已经解释了这一点: ISO C和ISO C ++之间的不兼容性以及C与C ++中的许多其他内容,并引用了C99和c ++ 98 ISO标准。

C中没有范围,所以一切都在“全局”命名空间中(在C ++中)

在bot C和C ++中运行的更简洁的方法是:

 struct myinnerstruct { int x; }; struct mystruct { struct myinnerstruct astruct; };