理解这段代码:C ++,#define表和枚举

时间:2012-05-23 06:29:14

标签: c++ enums

我很难理解这段代码。

#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。我不确定是否可以这样做,但请分享您的想法。

谢谢。

2 个答案:

答案 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示例。