Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从枚举重新定义值_C_Types_Typedef - Fatal编程技术网

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
不一定没有效果;也许其他人也这么想