从C99标准开始,C语言支持可变参数宏(Variadic Macros)。可变参数宏允许宏接受不定数量的参数,类似于函数中的可变参数列表。定义可变参数宏时,需要使用省略号(...)来表示可变参数部分,并使用__VA_ARGS__来引用这些可变参数。 可变参数宏的基本语法如下: c #define 宏名(固定参数, ...) 替换文本(__VA_ARGS__...
mic.c:9: error: for each function it appears in.) 原因在于,args... 和 ##__VA_ARGS__ 是不匹配的,正确的匹配应该是: 引用 #define debug(format, ...) fprintf(stderr, format, ##__VA_ARGS__) 注意,... 省略号对应的就是 __VA_ARGS__ 一般的,定义可变参数宏的一个流行方法,形如: 引...
/*C语言 宏定义之可变参数*/#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMDEBUG#ifdef MDEBUG#defineTEST_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__)#else#defineTEST_LOG(format,...)#endifinttest() {intnum =10; TEST_LOG("my num is %d .\n", num);retu...
(1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。如果调用:debug2("code = %d",100); 这样调用没有问题。 如果调用:debug2("hello"); 这里调用时,在format后面没有传入任何参数,那么就会编译错误,因为在宏替换之后变成了pr...
可变参数:关于宏定义的可变参数的关键是定义的时候使用省略号,引用的时候使用_ _VA_ARGS_ _ ,例如: //本例子摘自C99:6.10.3.5 - EXAMPLE 7 //定义: #define debug(...) fprintf(stderr, _ _VA_ARGS_ _) //使…
__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的。 GCC、VC2005开始支持。 #define CALCSUM(v, ...) sum(v, __VA_ARGS__) int sum(int num_args, ...) { int val = 0; va_list ap; int i; va_start(ap, num_args); ...
C在宏定义中使用的语言可变参数, 于C标准库的语言,printf、scanf、sscanf、sprintf、sscanf入输出函数,參数都是可变的。在调试程序时。我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一个不错的选择。在C99中规定宏也能够像函数一样带可变
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等。可变参数是实现printf(),sprintf()等函数的关键之处,也可以用可变参数来对任意数量的数据进行求和,求平均值带来方便(不然就用数组或每种写个重载)。在C#中有专门的关键字parame,但在C,C++并...
C语言 如何在宏定义中使用可变参数 faker 26452132 发布于 2013-03-06 有一个记录日志的函数,想用宏定义进行包装,简化调用方法,但是xlc报如下的错误: void _log(const int level, char* file, int line, const char* fmt, ...){ va_list ap; int count; time_t t; struct tm* st; char str_...