【发布时间】:2012-05-17 01:02:07
【问题描述】:
所以,假设我有以下 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++ 代码,这给我带来了很多麻烦。
非常感谢任何见解。谢谢!
【问题讨论】:
-
为什么不直接删除重新定义?
-
@stark :因为它不是重新定义(在 C++ 中),所以它是一个完全不同的类型。
-
@stark 就像重命名内部结构一样?在这个简单的例子中,这是一个明确的解决方案。但我实际使用的代码并不是那么简单,而且我没有那种灵活性,很遗憾。
-
一个更可爱的方法是在 C++ 程序中包含一个 C 头文件,其内容类似于:
typedef struct my_struct { } my_struct; -
@CrazyEddie - 对不起,我不明白。你能改写或详细说明吗?感谢您的帮助。