4

私は以下のようなものを書きました:

#define ABC20
//#define   ABC10
//#define   ABC00

#ifdef ABC20
    #define  SYSTEMNAME                       "ABC2"
#elif ABC10
    #define  SYSTEMNAME                       "ABC1"
#elif ABC00
    #define  SYSTEMNAME                       "ABC0"
#else
    #define  SYSTEMNAME                       "UNKNOWN"
#endif

そしてそれは働くことができます。

しかし、私が以下に変更した場合:

//#define ABC20
#define   ABC10
//#define   ABC00

#ifdef ABC20
    #define  SYSTEMNAME                       "ABC2"
#elif ABC10
    #define  SYSTEMNAME                       "ABC1"
#elif ABC00
    #define  SYSTEMNAME                       "ABC0"
#else
    #define  SYSTEMNAME                       "UNKNOWN"
#endif

コンパイルすると、ABC10が宣言されていないというエラーが発生しました。理由を知っていますか?

4

3 に答える 3

4

定義済みのテストを使用:

#ifdef ABC20
  #define  SYSTEMNAME                       "ABC2"
#elif defined ABC10
  #define  SYSTEMNAME                       "ABC1"
#elif defined ABC00
  #define  SYSTEMNAME                       "ABC0"
#else
  #define  SYSTEMNAME                       "UNKNOWN"
#endif

それ以外の場合、elif がチェックする条件はありません。前処理後に次のものが残るためです。   

#ifdef 
   #define  SYSTEMNAME                       "ABC2"
#elif 
  #define  SYSTEMNAME                       "ABC1"
#elif 
  #define  SYSTEMNAME                       "ABC0"
#else
  #define  SYSTEMNAME                       "UNKNOWN"
#endif

しかし、を入れるとdefined、テストが結果に置き換えられるため、次のようになります。

#if   0
  #define  SYSTEMNAME                       "ABC2"
#elif 1
  #define  SYSTEMNAME                       "ABC1"
#elif 0
  #define  SYSTEMNAME                       "ABC0"
#else
  #define  SYSTEMNAME                       "UNKNOWN"
#endif

または、テストを変更せずに、フラグに値を定義しtrue、残りのフラグに false 値を定義することもできます。

#define ABC20 0
#define ABC10 1
#define ABC00 0
于 2012-11-26T08:22:32.857 に答える
0

最初の例では、値を定義します...何もありません...それらの定義を作成するだけです。したがって、最初の

    #ifdef ABC20

動作します... ABC20が定義されているためです。

ただし、その行をコメントアウトすると、ABC20 が定義されなくなり、

    #elif

このステートメントは、値が定義されているかどうかを評価しませんが、存在しない定義自体を調べてテストします。

代わりにこれを試してください

    //#define ABC20 1
    #define   ABC10 1
    //#define   ABC00 1
于 2012-11-26T09:00:05.217 に答える
0

これは基本的に既出の回答と同じですが、別の天使から説明してみます。

ディレクティブ#elifは、の「else if」バリアントです#if。このディレクティブは式を取り、値が真 (ゼロ以外) かどうかをチェックします。この場合、式で使用されるすべての変数が存在する必要があります。(確かに、C 標準では、未定義のシンボルは値 0 で存在するかのように扱われるべきであると言われていますが、これに依存することは非常に悪い習慣と見なされています。)

あなたの場合、「#ifdef」に対応する「else if」バリアントを探しています。これは次のように書かれています。

#ifdef ABC20
#define  SYSTEMNAME                       "ABC2"
#elif defined(ABC10)
#define  SYSTEMNAME                       "ABC1"
...

後の括弧definedはオプションですが、含めるとコードが読みやすくなります。

于 2012-11-26T08:41:45.350 に答える