c语音 # ## 以及可变参数使用记录

来源:互联网 发布:java中的通配符 编辑:程序博客网 时间:2024/06/05 02:02

#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参数一样,这些参数不是宏的扩展。


0 0