1

組み込みシステム クラスのデバイス ハンドラを作成しており、マクロを使用して i 番目のビットが設定されているかどうかを確認しようとしています。マクロが正しく動作していないように見えますが、インライン関数は動作します。何故ですか?

#define TEST0 i&0x01
#define CLEAR0 i &= 0x01


inline short test0(short i) {
    return i&0x01;
}


int main() {
    short flag = 1;

    //this doesnt work
    if (TEST0(flag) == 0x01) {
        CLEAR0(flag);
    }

    //but this does
    if (test0(flag) == 0x01) {
        CLEAR0(flag);
    }

    return 0;
}
4

3 に答える 3

3

構文エラー。マクロには引数が必要です。

#define TEST0(i) ((i) & 0x01)

また、読みやすさのために空白を使用し、セキュリティのために括弧を使用してください。

于 2013-01-26T20:00:17.360 に答える
1

これは、演算子の優先順位の問題によるものです。また、マクロへのパラメーターが必要です。

次のように解析されます。

if (i & (0x01 == 0x01))

括弧とパラメーターを追加して修正します。

#define TEST0(i) ((i)&0x01)
#define CLEAR0(i) ((i) &= 0x01)
于 2013-01-26T19:59:12.303 に答える
0

マクロに引数を渡したい場合は、引数を受け入れるように定義する必要があります。

#define TEST0(i) ((i)&0x01)
#define CLEAR0(i) do { i&=0x01; } while(0)

(その他の変更は、優先順位と構文を扱います)。

于 2013-01-26T20:01:15.803 に答える