如何在C中使用具有相同名称的不同枚举

时间:2019-03-23 18:46:03

标签: c enums

我在一个图书馆liba中有一个enum,如下所示:

typedef enum LIB_A_ENUM {
  FOO,
  BAR
} LIB_A_ENUM

libb中,我还有另一个枚举:

typedef enum LIB_B_ENUM {
  FOO,
  BAR,
  BAZ // has a few different ones.
} LIB_B_ENUM

我想这样在libb中使用它们:

int
some_function() {
  if (LIB_A_ENUM.FOO) {
    // ...
  } else if (LIB_B_ENUM.FOO) {
    // ...
  }
}

想知道如何做这种事情。我在想我应该创建一些全局变量,例如:

LIB_A_ENUM LIB_A_ENUM_FOO = FOO;
LIB_A_ENUM LIB_A_ENUM_BAR = BAR;
// ...
LIB_B_ENUM LIB_B_ENUM_FOO = FOO;
LIB_B_ENUM LIB_B_ENUM_BAR = BAR;
LIB_B_ENUM LIB_B_ENUM_BAZ = BAZ;
// ...

int
some_function() {
  if (LIB_A_ENUM_FOO) {
    // ...
  } else if (LIB_B_ENUM_FOO) {
    // ...
  }    
}

想知道这是否是一种方法,或者是否有更好的方法。

实际上,我知道您甚至不能拥有两个具有相同键的枚举。因此,最好的办法就是让枚举值在全局范围内唯一。我不确定。

2 个答案:

答案 0 :(得分:1)

您是对的。由于枚举值存储在全局范围内,因此它们必须是全局唯一的。防止枚举中名称冲突的常用方法是为每个枚举值添加名称枚举名称作为前缀。这有点冗长,但在大多数情况下应该可以防止错误。

typedef enum LIB_A_ENUM {
  LIB_A_ENUM_FOO,
  LIB_A_ENUM_BAR
} LIB_A_ENUM;

typedef enum LIB_B_ENUM {
  LIB_B_ENUM_FOO,
  LIB_B_ENUM_BAR,
  LIB_B_ENUM_BAZ
} LIB_B_ENUM;

答案 1 :(得分:0)

不能。 C语言要求枚举常量的名称不得与同一范围内的其他标识符冲突。甚至全局变量也无济于事,因为您无法同时#include的两个标头...

所以您的选择归结为:

  • 更改枚举常量,使其具有前缀...(首选!)

    • 如果您无法更改库标头,那么也许可以在包含冲突标头之前#define,然后在#undef之后使用
  • 不要在同一个翻译单元中使用它们

  • 或者,如果您真的很幸运,可以在函数中#include其中一个标头 ;在那里的定义不会与外部的定义冲突。