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

时间:2012-05-17 01:02:08

标签: 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 ++代码,这给我带来了很多麻烦。

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

4 个答案:

答案 0 :(得分:2)

在C嵌套结构中实际上并不存在于父对象范围内。但是在C ++中,teststruct::innerstructinnerstruct的类型不同。这是为了改进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;
};