分享

__VA_ARGS__ 宏和##

 勤奋不止 2013-07-23

在 Android 的 NDK 下,不方便调试,记录log是个好方法。

    android/log.h 中有3个记录log的函数,其中__android_log_print(int priority, const char* tag, const char* fmt, ...);

    一般情况下,我们都是在debug模式下记录log,而在release模式下,不记录,我们一般使用宏来实现这样的功能。

    在release模式下,定义NDEBUG宏,而debug模式下不定义,这样我们可以通过该宏是否定义来设置是否记录log。但是C99之前,“...”这个不定参数只能用在函数,宏不能使用。有了C99,我们可以顺利地使用了。

    #ifndef NDEBUG

        #define LOG(priority, tag, fmt, ...)        __android_log_print(priority, tag, fmt, __VA_ARGS__)

    #else

        #define LOG(priority, tag, fmt, ...)       ((void)(0))

    #endif

    但是在gcc下,如果调用的时候没有后面的可变参数,会编译错误,而 VC9 不会。gcc做了扩展可以使用##来消除这个错误,也就是改成这样:

    #define LOG(priority, tag, fmt, ...)        __android_log_print(priority, tag, fmt, ##__VA_ARGS__)

    这样,无论VC还是gcc,都可以编译过了。

    不过我是在 .cpp 中使用gcc编译的,不知道在 .c 中,不使用 -std=c99 能否编译通过。

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多