在C语言中,可变参数函数依赖于两个宏定义:va_start、va_list、va_arg和va_end。这些宏定义定义在<stdarg.h>头文件中。它们的工作原理如下: va_list:定义一个类型为va_list的变量,用于保存可变参数列表的状态。 va_start:宏va_start初始化va_list变量,准备从可变参数列表的第一个参数开始处理。 va_arg:宏...
可变参数宏(Variadic Macros)是C99标准引入的一项特性,它允许宏接受可变数量的参数。这一特性极大地增强了宏的灵活性,使得宏能够处理更加复杂和多样化的输入。 展示如何定义可变参数宏 可变参数宏的定义使用省略号(...)来表示宏接受可变数量的参数。例如: c #define DEBUG(fmt, ...) fprintf(stderr, "DEBUG:...
C语言的宏文本替换,是通过预处理指令define实现的,#define的使用场景主要有:1)直接使用标识符不定义具体常量的标识符用法 2)替换常量的对象式宏(Object-like macros)3)模拟函数功能的函数式宏(Function-like macros)4)替换文中支持可变的参数数量的可变参宏 5)#和##运算法的用法等。define 标识符 当用...
1999 年的 ISO C 标准里规定了可变参数宏,语法和函数类似,比如: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的“...”表示可变参数,实际调用时,它们会替代宏体里的__VA_ARGS__。GCC 支持更复杂的形式,可以给可变参数取个名字,如下所示。 #define debug(format, args....
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。
首先明确一点就是,只使用可变参数宏是的话,可变参数只能替换不可处理。如果需要处理可变参数的话需要用可变参数函数。 可变参数宏 #define __var_macro(...) __VA_ARGS__ 其中__VA_ARGS__替换...传入参包括参数之间的分隔符,如__var_macro(123,456)中的...=123,456 ...
其实C99 标准已经支持了这个特性,但是其它的编译器不太给力,对 C99 标准的支持不是很好,只有 GNU C 支持这个功能,所以有时候我们也把这个可变参数宏看作是 GNU C 的一个语法扩展。 对于LOG 函数,如果我们想使用一个变参宏实现,就可以直接这样定义。
第一个参数为一个FILE指针。FILE结构在C语言的读写文件必不可少。要对屏幕输出传入stdout。第二个参数指定输出的格式。第三个参数是va_list类型,这个少见,但其实就是一个char *表示可变参参数的起始地址。返回值:成功返回输出的字节数(不包括最后的’\0’),失败返回-1。vsprintf()与上面函数类似,就只列出函数...
C语言中可变参数宏 今天来说说宏。什么?宏也能可变参数?是的,你没有听错,带参数的宏和函数一样,同样支持可变参数。下面通过一个小程序加以说明。 #define OUTSCREEN(msg, ...) printf(msg,__VA_ARGS__) int main(int argc, char* argv[]) {
printf("char %c\n", c); break; } va_end(ap); } 三:宏中的可变参数 C99中,类似于函数,宏也可以接受可变参数。比如下面的例子: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的”...”就是可变参数。在宏的调用中,它会展开为最后一个命名参数之后,’)’之前的...