• 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才支持。

  • 相关阅读:
    012.Nginx负载均衡
    011.Nginx防盗链
    010.Nginx正反代理
    009.Nginx缓存配置
    附007.Docker全系列大总结
    附024.Kubernetes全系列大总结
    008.Nginx静态资源
    007.Nginx虚拟主机
    006.Nginx访问控制
    005.Nginx配置下载站点
  • 原文地址:https://www.cnblogs.com/weichao975/p/8317454.html
Copyright © 2020-2023  润新知