在C语言中,可变参数函数依赖于两个宏定义:va_start、va_list、va_arg和va_end。这些宏定义定义在<stdarg.h>头文件中。它们的工作原理如下: va_list:定义一个类型为va_list的变量,用于保存可变参数列表的状态。 va_start:宏va_start初始化va_list变量,准备从可变参数列表的第一个参数开始处理。 va_arg:宏va...
经常看到源码的宏定义,一直不清楚 ## , _VA_ARGS , ... , args... 的作用是什么,记录下。 1999 年的 ISO C 标准里规定了可变参数宏,语法和函数类似,比如: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的“...”表示可变参数,实际调用时,它们会替代宏体里的__VA_...
可变参数函数形式如下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:通过最后一个确定的可变参数获得可变参数的内存栈 va_arg:获取可变参数栈中下一个typ...
C语言的宏文本替换,是通过预处理指令define实现的,#define的使用场景主要有:1)直接使用标识符不定义具体常量的标识符用法 2)替换常量的对象式宏(Object-like macros)3)模拟函数功能的函数式宏(Function-like macros)4)替换文中支持可变的参数数量的可变参宏 5)#和##运算法的用法等。define 标识符 当用...
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 假如我们将上面的代码稍作一下修改,变成下面的样子。 #define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__) int main(int argc, char* argv[]) { ("Hello World!"); ...
C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数宏就像下面这个样子: #definedbgprint(...) printf(__VA_ARGS__) 缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。
标识符中的...代表可变参数,args表示可变参数的名字,__LINE__是编译器内置的宏定义,表示当前行号。对于以上宏定义,如果我们传入的可变参数为空,会造成fprintf参数中多了一个逗号从而报错,为了解决这个问题,使用##表示如果可变参数为空,预处理器将去除掉它前面的那个逗号。
可变参数宏【C语言】 C99开始允许宏有可变参数,用省略号表达一个到多个参数,用__VA_ARGS__来传递参数。 如果要使用零个到多个参数,则应该用##__VA_ARGS__来传递参数。 #include <stdio.h> #include <stdlib.h> #define DEBUG(fmt, ...) fprintf (stderr, fmt, __VA_ARGS__)...
在使用可变参数宏的过程中,我们不仅可以传多个参数,也可以传入0个参数,比如 debug("debug"); 然而当我们真的这样做的时候,编译器会报一个错误,原因是因为进行宏替换以后变成了如下的形式: printf("debug",); __VA_ARGS__会替换为与省略号匹配的所有参数,同时会将省略号前面的一个逗号带上,在如果不带任何参...