我在一个图书馆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) {
// ...
}
}
想知道这是否是一种方法,或者是否有更好的方法。
实际上,我知道您甚至不能拥有两个具有相同键的枚举。因此,最好的办法就是让枚举值在全局范围内唯一。我不确定。
答案 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
其中一个标头 ;在那里的定义不会与外部的定义冲突。