从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...
1999 年的 ISO C 标准里规定了可变参数宏,语法和函数类似,比如: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的“...”表示可变参数,实际调用时,它们会替代宏体里的__VA_ARGS__。GCC 支持更复杂的形式,可以给可变参数取个名字,如下所示。 #define debug(format, args.....
变参宏的实现形式其实跟变参函数差不多:用… 表示变参列表,变参列表由不确定的参数组成,各个参数之间用逗号隔开。可变参数宏使用 C99 标准新增加的一个VA_ARGS预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list、va_start、va_end 这些宏去解析变参列表。预处理器在将宏展开时,会用变...
C99中,类似于函数,宏也可以接受可变参数。比如下面的例子: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的”...”就是可变参数。在宏的调用中,它会展开为最后一个命名参数之后,’)’之前的所有token,包括逗号,并替换掉宏体中的”__VA_ARGS__”。
可变参数(c/c++) 有时候我们在编写函数时,可能不知道要传入的参数个数,类型 。比如我们要实现一个叠加函数,再比如c语言中的printf,c++中的emplace_last()。 那么这些函数是如何实现的呢? 一、C语言版本 在C 中,可变参数通过 <stdarg.h> 头文件中的宏来处理。最常用的宏是 va_list、va_start、va_arg 和...
可变参数函数 可变参数函数形式如下void foo(int param1 , ...),使用可变参数函数的4个关键变量和宏是 <stdarg.h>va_listap;va_start(ap,param1);va_arg(ap,type);va_end(ap); 解释一下: va_list ap; 用于保存参数栈 va_start:通过最后一个确定的可变参数获得可变参数的内存栈 ...
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 假如我们将上面的代码稍作一下修改,变成下面的样子。 #define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__) int main(int argc, char* argv[]) { ("Hello World!"); ...