为什么在c / c ++中需要两个括号来使用宏?

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

这样做的原因是什么?

这样你就可以将整个参数列表传递给宏,并将其传递给一个带有可变数量参数的函数。

我敢打赌那个宏的定义是:

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

或者类似于其他一些像printf一样工作的函数。

如果它被定义为printf(args),那么您只能传递单个字符串参数,因为宏的参数不能包含不在嵌套括号内的逗号。

如果使用括号不能很好地写入所讨论的宏,则可能由于运算符优先级而需要。 以此宏为例:

 #define MY_MACRO(a) a * 11 

好吧,如果你这样做:

 int b = MY_MACRO(1 + 2); 

b ,而不是像它应该的33,实际上将被替换为int b = 1 + 2 * 11 ,它是23而不是33。如果你的宏不是那样写的(虽然没有围绕a括号)那么它是不必要。

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

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

以及

 KdPrint(( "fn %s ln %s\n", "my", "name" )); 

如果这是您正在讨论的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))会给你预期的结果。 这就是为什么你需要加倍括号。