从C99标准开始,C语言支持可变参数宏(Variadic Macros)。可变参数宏允许宏接受不定数量的参数,类似于函数中的可变参数列表。定义可变参数宏时,需要使用省略号(...)来表示可变参数部分,并使用__VA_ARGS__来引用这些可变参数。 可变参数宏的基本语法如下: c #define 宏名(固定参数, ...) 替换文本(__VA_ARGS__...
在C语言中,可变参数函数依赖于两个宏定义:va_start、va_list、va_arg和va_end。这些宏定义定义在<stdarg.h>头文件中。它们的工作原理如下: va_list:定义一个类型为va_list的变量,用于保存可变参数列表的状态。 va_start:宏va_start初始化va_list变量,准备从可变参数列表的第一个参数开始处理。 va_arg:宏va...
C语言的宏文本替换,是通过预处理指令define实现的,#define的使用场景主要有:1)直接使用标识符不定义具体常量的标识符用法 2)替换常量的对象式宏(Object-like macros)3)模拟函数功能的函数式宏(Function-like macros)4)替换文中支持可变的参数数量的可变参宏 5)#和##运算法的用法等。define 标识符 当用...
其实C99 标准已经支持了这个特性,但是其它的编译器不太给力,对 C99 标准的支持不是很好,只有 GNU C 支持这个功能,所以有时候我们也把这个可变参数宏看作是 GNU C 的一个语法扩展。 对于LOG 函数,如果我们想使用一个变参宏实现,就可以直接这样定义。 #define LOG(fmt, ...) printf(fmt, __VA_ARGS__) #...
/* C语⾔宏定义之可变参数 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MDEBUG #ifdef MDEBUG #define TEST_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__)#else #define TEST_LOG(format,...)#endif int test(){ int num = 10;TEST_LOG("my num...
__VA_ARGS__宏是用来表示可变参数宏的可变参数的内容。简单的说就是将可变参数宏中的 ... 的内容原样传递给右边__VA_ARGS__所在的位置。示例代码如下: /*** @file test.c* @author Ailson Jack (jackailson@foxmail.com)* blog: www.only2fire.com* @brief* @version 1.0* @date 2021-10-29** @...
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 假如我们将上面的代码稍作一下修改,变成下面的样子。 #define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__) int main(int argc, char* argv[]) { ("Hello World!"); ...
(1) C语言中可以定义参数可变的函数(如printf函数)。这里就像我们的open函数有两种方式。 (2)参数可变的函数的实现依赖于stdarg.h头文件。 (3) va_list变量与va_start,va_end和va_arg配合使用能够访问参数值。 可变参数的限制 (1) 可变参数必须从头到尾按照顺序逐个访问,不可以取中间的参数。
C语言可变参数宏 上一篇文章分享了可变参数在函数中的使用方法,但是可变参数还是只能应用在真正的函数中,不能使用在宏中,所以C99编译器标准中引入了宏`__VA_ARGS__`,它允许我们定义可变参数宏,这样我们就可以使用拥有可以变化的参数表的宏; 具体形式如下:...
可变参数:关于宏定义的可变参数的关键是定义的时候使用省略号,引用的时候使用_ _VA_ARGS_ _ ,例如: //本例子摘自C99:6.10.3.5 - EXAMPLE 7 //定义: #define debug(...) fprintf(stderr, _ _VA_ARGS_ _) //使…