1

我很难理解这段代码。

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

谢谢你。

4

2 回答 2

4

#define告诉预处理器(PP)替换东西。(定义语句被删除)
所以,从:

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参数。

STATE(STATE_2, true)关于你的第二个问题,现在我想你可以看到如果你在 TABLE 中添加另一个问题会如何结束。但您可以随时添加STATE(STATE_4, true)(-:

于 2012-05-23T06:51:02.130 回答
2

以下问题的更多答案:

A. and是“说”定义有效的地方
。意思是,如果你在 PP 之后写“STATE(STATE_2, true)”将不会替换它。#define#undef#undef

B.
状态旁边的逗号用于分隔枚举实体。

C.
枚举,除非另有明确定义,否则将给第一个实体值 0 并为每个值增加一个:

enum State_t
        {
            STATE_1, // = 0
            STATE_2, // = 1
            STATE_3, // = 2
            NUM_STATES // = 3
        }

实体的名称与值无关。

我认为您缺乏 C++ 的基础知识,并且您试图理解更复杂的东西。尝试寻找一个简单的枚举和#define 示例。

于 2012-05-23T07:18:56.237 回答