KdPrint(("Enter HelloWDMAddDevice\n"));
这样做的原因是什么?
这样您就可以将整个参数列表传递给宏,并将其传递给一个接受可变数量参数的函数。
我敢打赌,该宏的定义是:
#if DEBUG /* or something like it */
#define KdPrint(args) (printf args)
#else
#define KdPrint(args) /* empty */
#endif
或者类似于其他一些像 printf 一样工作的函数。
如果它被定义为 printf(args),那么您只能传递单个字符串参数,因为宏的参数不能包含不在嵌套括号内的逗号。
它导致括号内的所有内容都被视为宏的单个参数。在显示的示例中,它可以允许可变参数类型的参数:
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,实际上会被替换int b = 1 + 2 * 11
为 23 而不是 33。如果你的宏不是这样写的,但是(没有括号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
,并且结果与您5
预期的不同8
。做MULT((1+1), (2+2))
会给你预期的结果。这就是为什么你需要双括号。