#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)等价于
#define debug(format, args...) fprintf (stderr, format, args)这和上面举的那个定义的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述。
在标准C里,你不能省略可变参数,但是你却可以给它传递一个空的参数
debug ("A
message")
debug ("A
message",)
GNU CPP在这种情况下可以让你完全的忽略可变参数。在上面的例子中,编译器仍然会有问题(complain),因为宏展开后,里面的字符串后面会有个多余的逗号。
为了解决这个问题,CPP使用一个特殊的‘##’操作。书写格式为:
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
这里,如果可变参数被忽略或为空,‘##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。如果你在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。象其它的pasted macro参数一样,这些参数不是宏的扩展。
本文详细解释了C语言中debug宏的多参数处理方式,并通过对比标准C与GNU C++对宏参数的不同处理,展示了##操作符在忽略或为空参数情况下的作用。
1224

被折叠的 条评论
为什么被折叠?



