0

次のようなコードがあります。

someFunc(value)
{

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

SOMEMACRO が定義されており、値が 4 であるとしましょう。ケース 4 と 5 がスキップされ、代わりに FALSE が返されるのはなぜですか? :(

デフォルトのケースがないためですか、それとも switch ステートメントで ifdef を使用することが許可されていないためですか?

4

9 に答える 9

9

次のことを試してください。

someFunc(value)
{
  switch(value){
    case 1:
    case 2:
    case 3:
#ifdef SOMEMACRO
#error macro is defined
    case 4:
    case 5:
#else
#error macro is not defined
#endif
       return TRUE;
  }
  return FALSE;
}

これをコンパイルして、コンパイラが与える 2 つのエラーのどちらかを確認します。

于 2009-01-20T09:55:23.147 に答える
3

使用しているコンパイラ/プリコンパイラを指定しませんが、ほとんどの場合、プリプロセッサの結果を保持するオプションがあります。最初にチェックするのは、そこで生成されているものです。

確かに、もう少し次のようなコードを維持したいと思います。

    someFunc(value)
    {
        switch(value){
            case 1:
            case 2:
            case 3:
                return TRUE;
#ifdef SOMEMACRO
            // Special build for SOMEMACRO Inc.
            case 4:
            case 5:
                return TRUE;
#endif
            default:
                return FALSE;
        }
    }
于 2009-01-20T09:53:28.593 に答える
2

コンパイラによっては、前処理されたコードを読み取って検査する方法があるはずです。このようにして、遠くから推測して突っ込む必要がなくなり、コンパイラーにコンパイルを要求している正確なコードを確認できます。gcc では、関連するオプションは -E です

于 2009-01-20T09:54:53.957 に答える
2

「スイッチ」は壊れていない

多かれ少なかれ、The Pragmatic Programmerを引用します。

どこか別の場所でエラーを探してください。自分自身を納得させるために、someFunc に追加value = 4します。#define SOMEMACRO

すべての依存関係が解決されていることを確認するために、クリーン ビルドを作成します。

于 2009-01-20T10:14:17.820 に答える
1

SOMEMACRO を定義した後、モジュールをコンパイルしますか?

于 2009-01-20T09:46:59.043 に答える
0

他の人は、マクロが定義されているかどうかを確認する方法をすでに指定しています。

マクロがビルド システムによって定義されている場合、それを見つける良い方法は次のとおりです。ビルド出力を grep (または同様のテキスト検索ツール) にパイプして、マクロ定義 (次のようなもの) を検索しますmake | grep "-DSOMEMACRO"

システムに grep がない場合。ビルド出力をファイルにリダイレクトしてテキスト エディターで開き、テキスト検索を使用して手動で検査します)。

于 2009-01-20T09:57:51.847 に答える
0

他の人たちと同じように、あなたの仮定の 1 つが間違っているに違いないと思います。使用しているコンパイラはわかりませんが、MS Visual C++ の場合は、#ifdef 内に次のコードを記述して、SOMEMACRO が実際定義されていることを確認してください。

#ifdef SOMEMACRO

#pragma message("SOMEMACRO is defined")

    case 4:
    case 5:


#endif
于 2009-01-20T10:00:54.587 に答える
0

デフォルトのケースに「return false」を入れてみませんか?

于 2009-01-20T09:47:50.837 に答える
0

あなたの仮定の何かが真実ではありません。そのようにコードを変更し、そこから逆方向に作業してください。

#define SOMEMACRO 1

someFunc(value)
{

    value = 4;

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

これが true を返さない場合は、実際の問題があります。

于 2009-01-20T09:53:24.273 に答える