C语言宏高级用法 ## __VA_ARGS__

宏变量:

index

#define myprintf(...) printk("[lch]:File:%s, Line:%d, Function:%s," \  
     __VA_ARGS__, __FILE__, __LINE__ ,__FUNCTION__);  

此处的 #define 的作用是将 myprintf( )换成后面那一大串的内容,而括号内 ... 的内容原样抄写在 VA_ARGS 的位置。终于输出例如以下:
[lch]:File:arch/arm/mach-omap2/board-omap3wscec-camera.c, Line:163, Function:beagle_cam_init,camera init!

解析:

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等,就全然当一个变量来使用就可以。

你可能感兴趣的:(C语言宏高级用法 ## __VA_ARGS__)