重新定义枚举值

Mar*_*ark 1 c types typedef

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

typedef enum {
   STATE_INITIAL  = 0,
   STATE_LOAD     = 1,
   STATE_READ     = 2,
   STATE_FINISH   = 3
} state_t;
Run Code Online (Sandbox Code Playgroud)

我想重新定义STATE_FINISH的值.但是,我不想搞乱这个库,同时我不能在我的代码中这样做:

#undef STATE_FINISH
#define STATE_FINISH 2
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?

Rhi*_*ica 5

首先,#undef不会产生影响.这只适用于已经#defined的名字.所以你应该把它留下来.

其次,#define STATE_FINISH 2可能会产生你似乎想要的效果.但是,您必须确保在标题为#included的所有情况下始终使用它.否则,程序中用于STATE_FINISH的值将不一致.还必须执行#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;
Run Code Online (Sandbox Code Playgroud)

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

接下来,你真的确定要这样做吗?为什么?难道你#define STATE_FINISH STATE_READ不是意味着吗?差异似乎微妙,但是表达你真正的意思.

也许你的意思更像是#define MY_OWN_STATE STATE_READ什么?如果你使用你自己发明的名字来表达国家,那么你就会减少对真正意义的混淆STATE_FINISH.它还表示你不能改变STATE_FINISH库中使用的值(我希望你已经意识到了).