从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>#defineMDEBUG#ifdef MDEBUG#defineTEST_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__)#else#defineTEST_LOG(format,...)#endifinttest() {intnum =10; ...
可变参数宏【C语言】 C99开始允许宏有可变参数,用省略号表达一个到多个参数,用__VA_ARGS__来传递参数。 如果要使用零个到多个参数,则应该用##__VA_ARGS__来传递参数。 #include <stdio.h> #include <stdlib.h> #define DEBUG(fmt, ...) fprintf (stderr, fmt, __VA_ARGS__)...
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 假如我们将上面的代码稍作一下修改,变成下面的样子。 #define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__) int main(int argc, char* argv[]) { ("Hello World!"); ...
beyes@linux-beyes:~/C/micro> ./mic.exe hello world 编译通过,并正常输出。上面的代码,在 fprintf() 中的 args 前面加了两个 # 号 ##。 ##号的作用是: 如果可变参数部分( args...) 被忽略或为空,那么 "##" 操作会使预处理器 (preprocessor) 去掉它前面的那个逗号。如果在调用宏时,确实提供了一...
C语言可变参数宏 上一篇文章分享了可变参数在函数中的使用方法,但是可变参数还是只能应用在真正的函数中,不能使用在宏中,所以C99编译器标准中引入了宏`__VA_ARGS__`,它允许我们定义可变参数宏,这样我们就可以使用拥有可以变化的参数表的宏; 具体形式如下:...
于C标准库的语言,printf、scanf、sscanf、sprintf、sscanf入输出函数,參数都是可变的。在调试程序时。我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一个不错的选择。 在C99中规定宏也能够像函数一样带可变的參数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__...