4
    KdPrint(("Enter HelloWDMAddDevice\n"));

そうする理由は何ですか?

4

5 に答える 5

8

つまり、引数リスト全体をマクロに渡し、それを可変数の引数を取る関数に渡すことができます。

そのマクロの定義は次のとおりです。

#if DEBUG /* or something like it */
#define KdPrint(args) (printf args)
#else
#define KdPrint(args) /* empty */
#endif

または、printf と同じように機能する他の関数に似ています。

printf(args) として定義されている場合、ネストされた括弧内にないコンマをマクロの引数に含めることはできないため、単一の文字列引数のみを渡すことができます。

于 2011-04-28T02:24:49.650 に答える
4

これにより、括弧内のすべてがマクロに対する単一のパラメーターとして扱われます。示されている例では、varargs タイプのパラメーターを許可できます。

KdPrint(( "My info is %s\n", "my name" ));

としても

KdPrint(( "fn %s ln %s\n", "my", "name" ));
于 2011-04-28T02:26:13.697 に答える
3

問題のマクロが括弧を使用して適切に記述されていない場合は、演算子の優先順位のために必要になる場合があります。たとえば、次のマクロを使用します。

#define MY_MACRO(a) a * 11

さて、あなたがこれをしたなら:

int b = MY_MACRO(1 + 2);

b、本来の 33 ではなく、実際には which is 23 で 33 ではないものに置き換えられint b = 1 + 2 * 11ます。ただし、マクロがそのように記述されていない場合 ( の周りに括弧がない場合a)、それは不要です。

于 2011-04-28T02:27:27.500 に答える
1

これKdPrint()あなたが話していることである場合、これはフォーマット引数でマクロを使用できるためでKdPrint()あり、それは可変長マクロではありません。

たとえば、次のことができます。

KdPrint(("The answer is %d\n", 42));

等々。

于 2011-04-28T02:38:34.120 に答える
0

あなたの特定の例については、XdPrint とは何かがわからないため、お答えできません。

しかし、より一般的なケースでは、検索と置換が好きなマクロが原因です。あなたが持っていると仮定します:

#define MULT(a,b) (a*b)

を呼び出すとMULT(1+1, 2+2)、 になり、期待どおりではなく1+1*2+2結果になります。実行すると、期待される結果が得られます。そのため、ブラケットを 2 重にする必要があります。58MULT((1+1), (2+2))

于 2011-04-28T02:29:24.613 に答える