#define OUTSCREEN(msg, ...) printf(msg, ##__VA_ARGS__) 当可变参数的个数为0时,这里的##起到把前面多余的","去掉,实际上变成了printf(msg),这样编译就能通过了。 ,__VA_ARGS__这个宏实在不利于记忆,gcc对此做了扩展,另一种可接受的定义方法为: #define OUTSCREEN(msg, args...) printf(msg, ...
变参宏的实现形式其实跟变参函数差不多:用… 表示变参列表,变参列表由不确定的参数组成,各个参数之间用逗号隔开。可变参数宏使用 C99 标准新增加的一个 VA_ARGS 预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list、va_start、va_end 这些宏去解析变参列表。预处理器在将宏展开...
C语言中宏定义之##用于可变参数 C语⾔中宏定义之##⽤于可变参数 GCC ⽀持复杂的宏,它使⽤⼀种不同的语法,使你可以给可变参数⼀个名字,如同其它参数⼀样,⽐如:引⽤ #define debug(format, args...) fprintf(stderr, format, args)这种定义可读性更强,也更容易描述。完整测试代码:引...
} while (0) 这里用到的是__VA_ARGS__宏,C99中被标准化,编译时自动替换为实际对应的参数集。 ##的作用是正确处理变长参数为空的情况。 题外话: 这里我们可以额外加入一个宏,使得vassert具有和assert一样的开关性质。 #ifdefNDEBUG#definevassert(expr, fmt, ...) ((void)0)#else#definevassert(expr, ...
这里很清楚了,真正的函数是logger_action,两个宏分别包装了一下。这里: 1. 在宏定义中,使用__VA_ARGS__来表示可变参数,前面用...即可。如果可变参数为空,那么,理论上就会多产生一个逗号导致编译失败 (format参数后面多一个逗号),此时,__VA_ARGS__会自动消除多余的逗号。这是VC编译器的动作,如果是GNU的编译...
在C语言中,可变参数函数依赖于两个宏定义:va_start、va_list、va_arg和va_end。这些宏定义定义在<stdarg.h>头文件中。它们的工作原理如下: va_list:定义一个类型为va_list的变量,用于保存可变参数列表的状态。 va_start:宏va_start初始化va_list变量,准备从可变参数列表的第一个参数开始处理。
可变参数宏(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 标识符 当用...
C语言可变参数宏 上一篇文章分享了可变参数在函数中的使用方法,但是可变参数还是只能应用在真正的函数中,不能使用在宏中,所以C99编译器标准中引入了宏`__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); ...