可变参数的宏

参考自:

http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html

http://blog.csdn.net/aobai219/article/details/6092292

http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html

感谢lizezheng、TONGGETONGGE、MarvinGeng的指引!

可变参数的宏:

1. 可变参数的宏是C99规范开始支持的,具体用法如下:

#define debug(…) printf(__VA_ARGS__)

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

如果缺省号之前有逗号,就要写成下面的形式:

#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)

‘ ## ‘的意思是,如果可变参数被忽略或为空,将使预处理器(preprocessor)去除掉它前面的那个逗号。

2. 编译器内置的宏定义:

ANSI C的标准预定义宏:

__DATE__ : 以“月 日 年”的格式替换为当前日期,类型为字符串

__FILE__  : 替换为当前源文件名包括路径,类型为字符串

__LINE__ : 替换为当前行号,可以结合#line进行设置,#line之后的数字代表#line下一行的行号,之后行号以此类推,类型为整型值

__STDC__ : 当要求程序严格遵循ANSI C标准时该标识被赋值为1

__TIME__ : 以“时:分:秒”的格式替换为当前时间,类型为字符串

__TIMESTAMP__ : 以”星期  月  日  时:分:秒 年“的格式替换为最后一次修改当前源文件的时间,类型为字符串

详细描述见:

https://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

3. 两者结合就可以生成很有用的调试输出宏,例如:

1 #define __DEBUG__
2 #ifdef __DEBUG__
3 #define DEBUG(format,...) printf("Line:%4d     Time:"__TIME__"    " format"\n",__LINE__,##__VA_ARGS__)
4 #else
5 #define DEBUG(format,...)
6 #endif 

时间: 2024-10-10 18:15:38

可变参数的宏的相关文章

C语言可变参数在宏定义中的应用

在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)

c语言可变参数与宏定义

宏定义 https://www.cnblogs.com/wzd5230/p/10959032.html https://www.cnblogs.com/xyang0917/p/4172493.html https://blog.csdn.net/wukery/article/details/53286348 //...表示可变参数列表 #define LOG(format, args...) fprintf(stdout, format, args) LOG("%s","12

可变参数宏__VA_ARGS__

在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如: #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt,##arg) 用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表,如: void printf(const char* format, -); 直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中. C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(var

gnu printf可变参数宏

可变参数的宏 标准C只支持可变参数的函数,意味着函数的参数可以是不固定的 例如printf()函数的原型是int printf(const char *format [,argument]...) 而在GNU C中,宏也可以接受可变数目的参数,例如 #define pr_debug(fmt,arg...) printk(fmt,##arg) 这里arg表示其余的参数可以是零个或多个,这些参数以及参数之间的逗号构成arg的值,在宏扩展时替换arg ,例如 pr_debug("%s:%d"

__VA_ARGS__可变参数宏

#define qWiFiDebug(format, ...) qDebug("[WiFi] "format" File:%s, Line:%d, Function:%s", ##__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__); __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的作用在于,当可变参数

可变参数宏...和__VA_ARGS__

__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点).这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串.比如:#define PR(...) printf(__VA_ARGS__)int main(){    int wt=1,sp=2;    PR("hello\n");   

可变参数的函数与宏

1.可变参数的函数 <stdarg.h>头文件中定义了一些宏,用于可变参数的函数,如下 va_list:这种类型声明局部状态变量,假设变量名为va(用于下面的描述),用于遍历函数. va_start:这个宏初始化状态变量va,要先调用之后才能调用va_arg与va_end. va_arg:这个宏返回参数表中下一个参数的值,将内部指针(在va中)移到下一个参数,下一个参数的类型要用type指定,使va_arg能够计算其在堆栈中的长度,调用va_start之后第一次调用va_arg返回第一个可变参

C/C++ 使用宏在编译期计算可变参数个数

参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s 同时参考了cppformat源代码 C++是不提倡可变参数,理由不说了.但是类似printf的函数族使用起来确实很方便,我在查找printf的替代方案时无意间看到的.感慨下,微软的CString::Format确实很好用 cppformat提供类似printf的功能,但是又是类型安全的,其核心是利用C++强大的模版功能.在实现上,cppformat实现了在编译期计算可

可变参数省略号使用简介

C允许定义形参个数和类型不确定的函数.例如,C语言中的标准函数printf便使用这种机制.在声明不确定形参的函数时,形参部分可以使用省略号“…”代替.“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数. 如: [[email protected] exercise]# vi chang.c#include <stdio.h>int mult(int x , int y , const char * fmt , ...){ int result = x * y; i