1

因此,假设我有以下 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

4 回答 4

2

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

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

于 2012-05-17T01:14:00.270 回答
2

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

这已在此博客中进行了解释:ISO C 和 ISO C++ 之间的不兼容性以及 C 与 C++ 的许多其他内容,并参考了 C99 和 c++98 ISO 标准。

于 2012-05-17T01:20:19.227 回答
1

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

于 2012-05-17T01:09:01.597 回答
0

在 bot C 和 C++ 中工作的更简洁的方法是:

struct myinnerstruct
{
    int x;
};

struct mystruct
{
  struct myinnerstruct astruct;
};
于 2012-05-17T01:17:54.670 回答