3

これが私がやろうとしていることです。

step1) のような条件文(単純な複合)でマクロを呼び出したい

例:

 MACRO1(a==1)
 MACRO1((i!=NULL) && (j>10))

step2) このマクロを定義する方法は次のとおりです

#define MACRO1(condition) \
        if(!(condition)) ??????????????????????????

条件ステートメントが失敗した場合は、ここでマクロの定義を参照してください。正確な理由を知るのに役立つように、変数の値を出力したいと思います。定義で #condition を使用しましたが、条件で使用される変数の値ではなく、条件を出力するだけです。助けてください。

4

3 に答える 3

3

これらの行に沿って何かを行うことができます:

#define MACRO1(condition, msg) \
    if(!(condition)) { printf msg; }

次のように使用します。

MACRO1(a==1, ("a: %d\n", a))
MACRO1((i != NULL) && (j>10), ("i: %p, j: %d\n", i, j));

C プリプロセッサは単なる置換エンジンであり、式の内容を分析する機能はありません。

于 2013-10-30T06:36:04.147 に答える
2

変数を条件から分離する方法を私が知っている方法はありません。ただし、それらを追加のパラメーターとして渡すことができます。

#define MACRO(condition, printsyntax, ...) \
    if(!(condition)) {\
        printf("condition %s not met! (" printsyntax ")\n", #condition, __VA_ARGS__); \
    };

次のように使用します。

MACRO((i!=NULL) && (j>10), "i=%p, j=%d", i, j)

結果の例は次のとおりです。

condition (i!=NULL) && (j>10) not met! (i=(nil), j=11)

コンパイラは、定数文字列をつなぎ合わせて printf 用の 1 つの文字列にします。条件は自動的に出力され、残りの引数は正しく処理する必要があります。

編集

Jens の else に関する発言の後、コードを少し修正して、 を使用せずにそのような構造を許可しないようにしましdo{}while();た。

于 2013-10-30T06:36:13.337 に答える