C 从枚举重新定义值
我在使用的第三方库中定义了以下代码:C 从枚举重新定义值,c,types,typedef,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 还有别的办法吗?首先,#unde不会起作用。这只
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
还有别的办法吗?首先,#unde
不会起作用。这只适用于已定义的名称。所以你应该把它删掉
其次,#define STATE_FINISH 2
可能会产生您想要的效果。但是,您必须确保它始终用于标题为#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
之后重新定义,可能头文件中的某些代码已经使用了状态_FINISH
,这些代码将不会被替换。取决于你想要什么,这可能是错误的
接下来,你真的确定要这样做吗?为什么?你的意思是不是说“定义状态”、“完成状态”或者“读取”
?两者之间的区别似乎很微妙,但在于表达你真正的意思
也许你的意思更像是#定义我自己的状态(STATE)读取
?如果您使用自己发明的州名,您将减少对state\u FINISH
的真正含义的混淆。它还表示您不能更改库中使用的STATE\u FINISH
的值(当然,我希望您已经意识到这一点)。首先,\unde
不会产生任何效果。这只适用于已定义的名称。所以你应该把它删掉
其次,#define STATE_FINISH 2
可能会产生您想要的效果。但是,您必须确保它始终用于标题为#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
之后重新定义,可能头文件中的某些代码已经使用了状态_FINISH
,这些代码将不会被替换。取决于你想要什么,这可能是错误的
接下来,你真的确定要这样做吗?为什么?你的意思是不是说“定义状态”、“完成状态”或者“读取”
?两者之间的区别似乎很微妙,但在于表达你真正的意思
也许你的意思更像是
#定义我自己的状态(STATE)读取
?如果您使用自己发明的州名,您将减少对state\u FINISH
的真正含义的混淆。它还表达了这样一个事实,即您不能更改库中使用的STATE\u FINISH
的值(当然,我希望您已经意识到这一点)。如果您敢,您可以说
#define STATE_FINISH 2
无需#取消定义任何内容,因为typedef不是预处理器命令。您的预处理器定义现在将把所有出现的状态_FINISH替换为2,以便实际编译器永远不会看到该标识符
但这是否有意义是另一个问题
更新:我不能确定,但是当枚举由不同的整数类型(比如,字符)表示时,可能会出现一些微妙的问题。C没有覆盖过的函数,但是这将是C++中最突出的问题(并且独立于底层类型)。
#define STATE_FINISH 2
无需#取消定义任何内容,因为typedef不是预处理器命令。您的预处理器定义现在将把所有出现的状态_FINISH替换为2,以便实际编译器永远不会看到该标识符
但这是否有意义是另一个问题
更新:我不能确定,但是当枚举由不同的整数类型(比如,字符)表示时,可能会出现一些微妙的问题。C没有覆盖过的函数,尽管这是C++中最突出的问题(并且独立于底层类型)。那么一个定义规则呢?即使您设法更改了
STATE\u FINISH
的值,库的“内部”也不会看到更改,仍然将3
视为STATE\u FINISH
——所以:不要这样做。简而言之,一旦enum的声明完成,就没有办法更改它。正如您所提到的,您可以使用#define
来实现效果,但这是一项非常糟糕的工作(因此,您不能使用它是件好事)。真正的问题是:你到底为什么要这样做?改变状态如何不影响图书馆?那么一个定义规则呢?即使您设法更改了STATE\u FINISH
的值,库的“内部”也不会看到更改,仍然将3
视为STATE\u FINISH
——所以:不要这样做。简而言之,一旦enum的声明完成,就没有办法更改它。正如您所提到的,您可以使用#define
来实现效果,但这是一项非常糟糕的工作(因此,您不能使用它是件好事)。真正的问题是:你到底为什么要这样做呢?#unde
不一定没有效果;也许其他人也这么想