• args...、##args、#、##、__VA_ARGS__和##__VA_ARGS__的作用


    #define PRINT_PAIR(...) printf("A. <x, y>=<%d,%d>
    ", __VA_ARGS__)
    #define PRINT_SELF(...) printf(__VA_ARGS__)
    #define DEBUG_1(args...) printf(args)
    #define DEBUG_2(fmt,args...) printf(fmt,args)
    #define DEBUG_3(fmt,args...) printf(fmt,##args)
    
    PRINT_PAIR(2, 3);
    PRINT_SELF("B. <x, y>=<%d,%d>
    ", 4, 5);
    DEBUG_1("1.:<%d,%d>
    ",6,7);
    DEBUG_2("2.:<%d,%d>
    ",7,8);
    DEBUG_3("3.:<%d,%d>
    ",8,9);
    

    直接看结果:

    A. <x, y>=<2,3>
    B. <x, y>=<4,5>
    1.:<6,7>
    2.:<7,8>
    3.:<8,9>
    

    说明:
    ...和__VA_ARGS__ :括号内 ... 的内容原样抄写在_VA_ARGS__ 的位置。
    args...和##args:其中 ##符号应该是可以省略的,直接使用 args也是可以达到类似效果.

    解析:

    1)VA_ARGS:整体来说就是将左边宏中 ... 的内容原样抄写在右边 VA_ARGS 所在的位置。它是一个可变參数的宏,是新的C99规范中新增的,眼下似乎仅仅有gcc支持(VC从VC2005開始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,并且右变量与左输出格式是一一相应的。所以在上面那个样例中, __VA_ARGS__仅仅能是一些不含不论什么变量的字符串常量。由于上面的样例中若__VA_ARGS__含有变量,整个printf的输出与变量便不能一一相应,输出会出错。

    假设不过替换函数名,可用例如以下方式,此时对__VA_ARGS__无不论什么特殊要求:#define myprintf(...) printk( VA_ARGS),在调试程序时能够这样用:

        #ifndef LOG_NDEBUG_FUNCTION  
        #define LOGFUNC(...) ((void)0)  
        #else  
        #define LOGFUNC(...) (printk(__VA_ARGS__))  
        #endif  
    
    1. FILE :宏在预编译时会替换成当前的源文件名称
    2. LINE:宏在预编译时会替换成当前的行号
    3. FUNCTION:宏在预编译时会替换成当前的函数名称
      5)类似的宏还有 TIME,STDC, __TIMESTAMP__等,就全然当一个变量来使用就可以。
  • 相关阅读:
    loadrunner压测java请求
    Omnitty的使用
    软件工程之感想
    《人月神话》读后感
    my idea之NSBC分析
    电梯调度 总结稿 刘博&徐梦迪
    敏捷开发综述
    数组最大子数组和(续)之动态规划
    求二维数组最大子数组和 刘博&徐梦迪
    数组中的最大子数组的和 刘博&徐梦迪
  • 原文地址:https://www.cnblogs.com/spfanlost/p/13764253.html
Copyright © 2020-2023  润新知