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

它导致括号内的所有内容都被视为宏的单个参数。在显示的示例中,它可以允许可变参数类型的参数:

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,实际上会被替换int b = 1 + 2 * 11为 23 而不是 33。如果你的宏不是这样写的,但是(没有括号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,并且结果与您5预期的不同8。做MULT((1+1), (2+2))会给你预期的结果。这就是为什么你需要双括号。

于 2011-04-28T02:29:24.613 回答