3

这是一个人为的例子,但表达了核心问题。我有一个联合和一个结构,它与现有代码库中的嵌套结构相同:

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 下编译会出现错误“错误:重新定义 'struct _MyStruct'”。

首先,为什么我能够将命名结构作为嵌套结构成功编译?我怀疑 GHC 正在使用一些 C++ 规则进行编译,或者它支持嵌套结构中的命名结构。

其次,什么可以让我在没有任何重大代码更改的情况下成功编译?我知道我可以从嵌套结构中删除 _MyNestedStruct ,但这有什么后果吗?

4

1 回答 1

9

在 C 中,没有隐式或显式的命名空间范围,因此所有结构名称共享相同的命名空间。因此,struct _MyNestedStruct定义了两次,这是一个错误。GCC 是正确的,GHC 不是。

如果是 C++,那么代码是正确的,因为每个结构都会创建不同的命名空间范围,因此不会发生名称冲突。

我能想到的解决方案:

A)如果结构实际上是相同的,那么只在其他结构之外定义一次(你可以将它放在第一个结构中,但这会很奇怪)。

struct _MyNestedStruct
{
    int field
};

typedef union _MyUnion
{
  unsigned int A;
  struct _MyNestedStruct MyNestedStruct;
} MyUnion;

typedef struct _MyStruct
{
  struct _MyNestedStruct MyNestedStruct;
} MyStruct;

B) 以不同的方式命名这两个结构。在 C 中,名称并不那么重要,只要定义相同即可。

C) 使用无名结构。我认为您根本不会使用这些名称:

typedef union _MyUnion
{
  unsigned int A;
  struct
  {
    int field;
  } MyNestedStruct;
} MyUnion;

typedef struct _MyStruct
{
  struct
  {
    int field;
  } MyNestedStruct;
} MyStruct;

BTW, remember that any name beginning with and underscore plus an uppercase is reserved for the implementation and should not be defined by the user.

于 2012-11-06T00:23:41.400 回答