c - 从枚举中重新定义值

标签 c types typedef

我在我正在使用的第 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 不会有任何效果。这仅适用于 #defined 的名称。所以你应该把它去掉。

其次,#define STATE_FINISH 2 可能会产生您想要的效果。但是,您必须确保在 header 为 #included 的所有情况下始终使用它。否则,程序中用于 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/

相关文章:

c - C语言链表结构中安全释放值的策略

arrays - string 与 []byte 类型定义

c - 在 C 中为结构类型分配内存

c - 如何将一个 .c 文件中定义的结构填充到另一个 .c 中定义的函数中,而不将指针作为参数传递?

c - 什么是 ulConfig |= ulMode;意思是?

c++ - 为具有特定成员变量值的类创建不同类型

c++ - Typedef 不是命名空间的成员

c++ - `synonym` 中的 `typedef` 是强制性的吗?

c - TCP 套接字在循环中途停止写入

javascript - React中颜色输入 : The format is "#rrggbb" where rr, gg,bb为两位十六进制数