所以,说我有以下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 ++代码,这给我带来了很多麻烦。
非常感谢任何见解。谢谢!
答案 0 :(得分:2)
在C嵌套结构中实际上并不存在于父对象范围内。但是在C ++中,teststruct::innerstruct
与innerstruct
的类型不同。这是为了改进C ++代码中的封装。如果没有这个规则,同一名称空间中没有两种类型可以定义嵌套的iterator
类,例如,这将是非常糟糕的。
C以其他许多非常愚蠢的方式对待结构,因此他们在这里做错了也就不足为奇了。但是,C不会允许类型作用域,并且在这里有一个合理的规则会为语言引入许多其他概念 - 最终,它需要引入namespace
s,由于某种原因从未进行过。< / p>
答案 1 :(得分:2)
在C中,内部结构的定义超出了外部结构,而在C ++中并非如此。
此博客已对此进行了解释:Incompatibilities Between ISO C and ISO C++ C vs. C ++ 中的许多其他内容,引用了C99和c ++ 98 ISO标准。
答案 2 :(得分:1)
C中没有范围,所以一切都在“全局”命名空间中(用C ++说)
答案 3 :(得分:0)
在bot C和C ++中运行的更简洁的方法是:
struct myinnerstruct
{
int x;
};
struct mystruct
{
struct myinnerstruct astruct;
};