zoukankan      html  css  js  c++  java
  • GNU C和C99标准中的可变参数宏(variadic macros)

    用可变参数宏(variadic macros)传递可变参数表
    你可能很熟悉在函数中使用可变参数表,如:

    void printf(const char* format, …);

    直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中。

    C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数宏就像下面这个样子:

    #define debug(…) printf(__VA_ARGS__) //最好定义为#define debug(…) printf(##__VA_ARGS__),后面有关于##的说明

    缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。例如:

    Debug(“Y = %d ”, y);

    而处理器会把宏的调用替换成:

    printf(“Y = %d ”, y);

    因为debug()是一个可变参数宏,你能在每一次调用中传递不同数目的参数:

    debug(“test”); //一个参数

    可变参数宏不被ANSI/ISO C++ 所正式支持。因此,你应当检查你的编译器,看它是否支持这项技术。

    用GCC和C99的可变参数宏, 更方便地打印调试信息

    gcc的预处理提供的可变参数宏定义真是好用: 

    #ifdef DEBUG
    	#define dbgprint(format,args...) 
    	fprintf(stderr, format, ##args)
    #else
    	#define dbgprint(format,args...)
    #endif
    

    如此定义之后,代码中就可以用dbgprint了,例如dbgprint("aaa %s", __FILE__);。感觉这个功能比较Cool  :em11: 

    下面是C99的方法: 

    #define dgbmsg(fmt,...) 
                 printf(fmt,##__VA_ARGS__

    新的C99规范支持了可变参数的宏

    具体使用如下:

     以下内容为程序代码:

     #include <stdarg.h> #include <stdio.h>

     #define LOGSTRINGS(fm, ...) printf(fm,##__VA_ARGS__)

     int main() {      LOGSTRINGS("hello, %d ", 10);      return 0; } 

     但现在似乎只有gcc才支持。

  • 相关阅读:
    Unity编译Android的原理解析和apk打包分析
    TokuDB性能测试报告
    一起脱去小程序的外套和内衣
    go单元测试进阶篇
    小程序发布后最全解析!
    部署在腾讯云的公益网站遭受了一次CC攻击
    基于Http原理实现Android的图片上传和表单提交
    腾讯云TCCE培训认证 精彩的第一次
    【腾讯云的1001种玩法】在腾讯云上创建您的SQL Cluster(5)
    腾讯云容器服务的滚动升级使用简介
  • 原文地址:https://www.cnblogs.com/weichao975/p/8317454.html
Copyright © 2011-2022 走看看