KdPrint(("Enter HelloWDMAddDevice\n"));
そうする理由は何ですか?
つまり、引数リスト全体をマクロに渡し、それを可変数の引数を取る関数に渡すことができます。
そのマクロの定義は次のとおりです。
#if DEBUG /* or something like it */
#define KdPrint(args) (printf args)
#else
#define KdPrint(args) /* empty */
#endif
または、printf と同じように機能する他の関数に似ています。
printf(args) として定義されている場合、ネストされた括弧内にないコンマをマクロの引数に含めることはできないため、単一の文字列引数のみを渡すことができます。
これにより、括弧内のすべてがマクロに対する単一のパラメーターとして扱われます。示されている例では、varargs タイプのパラメーターを許可できます。
KdPrint(( "My info is %s\n", "my name" ));
としても
KdPrint(( "fn %s ln %s\n", "my", "name" ));
問題のマクロが括弧を使用して適切に記述されていない場合は、演算子の優先順位のために必要になる場合があります。たとえば、次のマクロを使用します。
#define MY_MACRO(a) a * 11
さて、あなたがこれをしたなら:
int b = MY_MACRO(1 + 2);
b
、本来の 33 ではなく、実際には which is 23 で 33 ではないものに置き換えられint b = 1 + 2 * 11
ます。ただし、マクロがそのように記述されていない場合 ( の周りに括弧がない場合a
)、それは不要です。
これがKdPrint()
あなたが話していることである場合、これはフォーマット引数でマクロを使用できるためでKdPrint()
あり、それは可変長マクロではありません。
たとえば、次のことができます。
KdPrint(("The answer is %d\n", 42));
等々。
あなたの特定の例については、XdPrint とは何かがわからないため、お答えできません。
しかし、より一般的なケースでは、検索と置換が好きなマクロが原因です。あなたが持っていると仮定します:
#define MULT(a,b) (a*b)
を呼び出すとMULT(1+1, 2+2)
、 になり、期待どおりではなく1+1*2+2
結果になります。実行すると、期待される結果が得られます。そのため、ブラケットを 2 重にする必要があります。5
8
MULT((1+1), (2+2))