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_tenumにState_t={STATE_1、STATE_2、STATE_3}を残し、可能であればNUM_STATES = 4を、おそらく#ifndefを使用して作成するにはどうすればよいですか。これができるかどうかはわかりませんが、あなたのアイデアを共有してください。

ありがとうございました。

4

2 に答える 2

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
        }

valid注:STATE定義はパラメーター を使用しません。

STATE(STATE_2, true)2番目の質問に関しては、 TABLEに別の質問を追加するとどうなるかがわかると思います。ただし、いつでも追加できますSTATE(STATE_4, true)(-:

于 2012-05-23T06:51:02.130 に答える
2

次の質問に対するいくつかの回答:

A.と
は、定義が有効な場所を「言っています」。つまり、PPの後に「STATE(STATE_2、true)」と書くと、PPはそれを置き換えません。#define#undef#undef

B.
状態の横のコンマは、列挙型エンティティを区切るものです。

C.
列挙型は、特に明記されていない限り、最初のエンティティに値0を与え、値ごとに1ずつ増やします。

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

エンティティの名前は値とは無関係です。

あなたはC++の基本を欠いていて、もっと複雑なことを理解しようとしていると思います。簡単な列挙型と#defineの例を探してみてください。

于 2012-05-23T07:18:56.237 に答える