【发布时间】:2012-11-05 23:58:30
【问题描述】:
这是一个人为的例子,但表达了核心问题。我在现有代码库中有一个联合和一个具有相同嵌套结构的结构:
typedef union _MyUnion
{
unsigned int A;
struct _MyNestedStruct
{
int field
} MyNestedStruct;
} MyUnion;
和
typedef struct _MyStruct
{
struct _MyNestedStruct
{
int field
} MyNestedStruct;
} MyStruct;
如果我在 Green Hills Compiler (GHC) 下编译,则没有问题。在 GCC 下编译会报错“error: redefinition of 'struct _MyStruct'”。
首先,为什么我能够将命名结构作为嵌套结构成功编译?我怀疑 GHC 正在使用一些 C++ 规则进行编译,或者它支持嵌套结构中的命名结构。
其次,什么可以让我在不进行任何重大代码更改的情况下成功编译?我知道我可以从嵌套结构中删除 _MyNestedStruct,但这有什么后果吗?
【问题讨论】:
-
也许你真的在重新定义结构,因为我可以在这里的许多 GCC 发行版中很好地编译它。
-
是否有任何理由将 MyNestedStruct 更改为声明而不是定义?也就是说,在包含 union/struct 的外部定义 _MyNestedStruct,然后在容器内声明该结构的实例
-
@FlávioToribio:也许你正在将它编译为 C++,因为我得到了错误。
-
我刚刚注意到他使用了相同的结构名称,并且可能将两个 typedef 放在同一个源中。