我在第三方库中定义了此代码,我使用:
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
还有其他办法吗?
答案 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 ++中最明显的问题(并且与底层类型无关)。