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

Symbol clashing of inner and outer structs, C++ vs C

本文关键字:C++ vs 冲突 符号 外部 结构 内部      更新时间:2023-10-16

所以,假设我有以下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::innerstructinnerstruct是不同的类型。这是为了改进C++代码中的封装。例如,如果没有此规则,同一命名空间中的任何两个类型都无法定义嵌套的iterator类,这将是非常糟糕的。

C 以许多其他非常愚蠢的方式处理结构,所以他们在这里做错事也就不足为奇了。然而,C 不允许类型范围,在这里有一个理智的规则会给语言引入许多其他概念——最终,它需要引入 namespace s,但由于某种原因从未这样做过。

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

这在本博客中已经解释过:ISO C 和 ISO C++之间的不兼容性在 C 与 C++ 中参考 C99 和 C++98 ISO 标准的许多其他内容。

C 中没有作用域,所以一切都在"全局"命名空间中(C++说(

在机器人 C 和 C++ 中工作的更简洁的方法是:

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