2011-04-28 90 views

回答

7

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

我敢打赌任何宏观的定义是:

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

或相近的工作就像printf的一些其他功能。

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

+0

你可能是对的!但是我认为编写这个宏的人做得不好。他应该围绕'args'放置括号。 – 2011-04-28 02:34:01

+2

不,重点是逗号可能不止一个,所以它在宏外面加括号。 – Random832 2011-04-28 02:37:42

+0

明白了,谢谢 – 2011-04-28 02:44:00

3

它导致在parens内的所有东西都被视为宏的单个参数。在显示的例子,它可以允许可变参数类型的参数:

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

至于以及

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

如果有问题的宏并没有使用括号写得很好,可能是因为运营商是必要的优先。就拿这个宏例如:

#define MY_MACRO(a) a * 11 

好吧,如果你这样做:

int b = MY_MACRO(1 + 2); 

b,的而不是33像它应该,实际上与int b = 1 + 2 * 11这是23而不是33来代替。如果你的宏不是这样写的,尽管(没有围绕a的括号),那就没有必要了。

+0

虽然对宏观陷阱有深入的了解,但如果这确实是问题,那么KdPrint会在宏本身中放置括号。它更可能是a)它需要将所有参数传递给一个接受可变数量参数的函数,或者b)它试图与不支持__VA_ARGS__的预处理器兼容,这意味着您必须传递所有参数作为一个单一的宏参数,直到它们达到功能级别。 – 2013-08-08 21:47:40

0

对于您的具体示例,我无法告诉您,因为我不知道XdPrint是什么。

但在更一般的情况下,这是因为我喜欢搜索和替换的宏。假设你有:

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

如果你打电话MULT(1+1, 2+2),它会成为1+1*2+2,并导致作为5而不是8正如你期望的那样。做MULT((1+1), (2+2))会给你预期的结果。这就是为什么你需要加倍括号。

1

如果this是您所说的KdPrint(),那么这是因为您可以使用带格式参数的KdPrint()宏,而且它不是可变长度的宏。

例如,你可以这样做:

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

等。

相关问题