我很难理解这段代码。
#define TABLE \
STATE(STATE_1, true) \
STATE(STATE_2, false) \
STATE(STATE_3, true)
enum State_t
{
#define STATE( state, valid) state,
TABLE
#undef STATE
NUM_STATES
}
我知道State_t枚举将有STATE_1,STATE_2和STATE_3以及NUM_STATES = 3,但我很难理解其机制。有人可以请你解释一下。
此外,现在我想定义一个重复状态,例如:
#define TABLE \
STATE(STATE_1, true) \
STATE(STATE_2, false) \
STATE(STATE_3, true) \
STATE(STATE_2, true)
但由于重新定义了STATE_2,这会给编译器带来错误。如何使State_t枚举仍然具有State_t = {STATE_1,STATE_2,STATE_3},如果可能,NUM_STATES = 4,可能使用#ifndef。我不确定是否可以这样做,但请分享您的想法。
谢谢。
答案 0 :(得分:4)
#define
告诉预处理器(PP)替换东西。 (删除了define语句)
所以,从:
enum State_t
{
TABLE
NUM_STATES
}
PP将用它的定义替换TABLE:
enum State_t
{
STATE(STATE_1, true)
STATE(STATE_2, false)
STATE(STATE_3, true)
NUM_STATES
}
现在PP将用STATE定义替换每个STATE,结果是:
enum State_t
{
STATE_1,
STATE_2,
STATE_3,
NUM_STATES
}
注意:STATE定义不使用valid
参数。
关于你的第二个问题,现在我想如果你向TABLE添加另一个STATE(STATE_2, true)
,你可以看到它将如何结束。但您可以随时添加STATE(STATE_4, true)
( - :
答案 1 :(得分:2)
以下问题的更多答案:
一个。
#define
和#undef
是“说”定义有效的地方。意思是,如果你在PP #undef
之后写下“STATE(STATE_2,true)”就不会取代它。
B中。
状态旁边的逗号分隔枚举实体。
℃。
枚举,除非另有明确定义,否则为第一个实体赋值0,并为每个值增加一个:
enum State_t
{
STATE_1, // = 0
STATE_2, // = 1
STATE_3, // = 2
NUM_STATES // = 3
}
实体的名称与价值无关。
我认为你缺乏C ++的基础知识,并且你试图理解更复杂的东西。 尝试寻找一个简单的枚举和#define示例。