重新定义枚举值

时间:2015-06-04 14:28:27

标签: c types typedef

我在第三方库中定义了此代码,我使用:

typedef enum {
   STATE_INITIAL  = 0,
   STATE_LOAD     = 1,
   STATE_READ     = 2,
   STATE_FINISH   = 3
} state_t;

我想重新定义STATE_FINISH的值。但是,我不想弄乱图书馆,同时我也不能在我的代码中这样做:

#undef STATE_FINISH
#define STATE_FINISH 2

还有其他办法吗?

2 个答案:

答案 0 :(得分:5)

首先,#undef不起作用。这仅适用于#define d的名称。所以你应该把它留下来。

其次,#define STATE_FINISH 2可能会产生您似乎想要的效果。但是,您必须确保在标题为#include d的所有情况下始终使用它。否则,程序中用于STATE_FINISH的值将不一致。此外,您必须在<{em> #define之后执行#include 。如果您之前执行此操作,它将在头文件中进行替换,这会将enum定义更改为不正确的

typedef enum {
   STATE_INITIAL  = 0,
   STATE_LOAD     = 1,
   STATE_READ     = 2,
   2   = 3 /* or STATE_READ = 3, for the other variant; also wrong */
} state_t;

现在结合这些关于订单的警告:你无法保证这一点。如果您在#define之后重新#include,则表头文件中的某些代码可能已使用STATE_FINISH,而这些代码将不会被替换。根据你的需要,这可能是错误的。

接下来,你真的确定要这样做吗?为什么?难道你不是指#define STATE_FINISH STATE_READ而是吗?差异似乎很微妙,但是要表达你的真实含义。

也许你的意思更像#define MY_OWN_STATE STATE_READ?如果你使用自己发明的名称来表示状态,那么对STATE_FINISH的真正含义的混淆就会减少。它还表示您无法更改库中使用的STATE_FINISH的值(我希望您已经意识到这一点)。

答案 1 :(得分:0)

如果你敢,你可以说

#define STATE_FINISH 2

不需要#undefine,因为typedef不是预处理器命令。您的预处理器定义现在将用2替换所有出现的STATE_FINISH,以便实际的编译器永远不会看到该标识符。

这是否有意义,但另一个问题。

更新:我无法确定它,但是当枚举由不同的整数类型(例如,字符)表示时,可能会出现细微的问题。 C没有过载函数,虽然这是C ++中最明显的问题(并且与底层类型无关)。