分享

LINUX?C中用define定义可变参数的宏

 My Room 2012 2011-11-05
一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在细节上可能存在区别.
1. __VA_ARGS__
        __VA_ARGS__ 将 "..." 传递给宏 . 如
        #define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)

2. GCC的复杂宏
        GCC使用一种不同的语法,从而可以给可变参数一个名字,如同其它参数一样.
        #define debug(format, args...) fprintf (stderr, format, args)
        这和第一条的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述.

3. ##__VA_ARGS__
        上面两个定义的宏,如果出现 debug("A Message")的时候,由于宏展开后有个多余的逗号,所以将导致编译错误.
        为了解决这个问题,CPP 使用一个特殊的"##"操作,格式如下:
        #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
        这里,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多