关闭

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

149人阅读 评论(0) 收藏 举报

#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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19392次
    • 积分:508
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:13篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论