我在我正在使用的第 3 方库中定义了这段代码:
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
还有别的办法吗?
最佳答案
首先,#undef
不会有任何效果。这仅适用于 #define
d 的名称。所以你应该把它去掉。
其次,#define STATE_FINISH 2
可能会产生您想要的效果。但是,您必须确保在 header 为 #include
d 的所有情况下始终使用它。否则,程序中用于 STATE_FINISH 的值将不一致。您还必须在 #include
之后执行 #define
。如果您之前这样做,它已经在头文件中进行了替换,这会将 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;
现在结合这些关于顺序的警告:你无法保证正确。如果在#include
之后重新#define
,可能头文件里面的部分代码已经使用了STATE_FINISH
,不会被替换.根据您的需要,这可能是错误的。
接下来,你真的确定要这样做吗?为什么?你不是说 #define STATE_FINISH STATE_READ
吗?差异看似微妙,但其实是在表达您真正的意思。
也许你的意思更像是#define MY_OWN_STATE STATE_READ
?如果您为状态使用自己发明的名称,您将减少对 STATE_FINISH
真正含义的混淆。它还表达了这样一个事实,即您无法更改库中使用的 STATE_FINISH
的值(当然,我希望您已经意识到这一点)。
关于c - 从枚举中重新定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30646633/