可变参数宏允许宏接受不定数量的参数,类似于函数中的可变参数列表。定义可变参数宏时,需要使用省略号(...)来表示可变参数部分,并使用__VA_ARGS__来引用这些可变参数。 可变参数宏的基本语法如下: c #define 宏名(固定参数, ...) 替换文本(__VA_ARGS__) 例如,定义一个打印可变参数的宏: c #define ...
如果可变参数部分( args...) 被忽略或为空,那么 "##" 操作会使预处理器 (preprocessor) 去掉它前面的那个逗号。如果在调用宏时,确实提供了一些可变参数,GNU C 也会正常工作,它会把这些可变参数放在逗号的后面;如果没有提供,它就会自动去掉前面的逗号,使宏结束展开 --- 补充完右边括号。 另外,假如按照 C99...
1.可变参数函数 可变参数函数是一种函数,允许在函数定义中接受可变数量的参数。C语言提供了stdarg.h头文件来支持可变参数函数的实现。示例代码:在这个示例中,我们定义了一个可变参数函数sum,它接受一个整数参数count,表示接下来的可变参数的数量。通过使用va_list、va_start、va_arg和va_end宏,我们可以依次...
象其它的pasted macro参数一样,这些参数不是宏的扩展。 /*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...
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。如果调用:debug2("code = %d",100); 这样调用没有问题。
1. 首先我们需要知道,可变参数宏是在C99标准中才实现的,以前没定义这个 __VA_ARGS__宏,这个宏就代表可变参数列表,在GCC中 也支持args...这种写法。 2. 关于do {...}while(0) 的用处多多,其中一个就是防止宏展开后,代码出问题。 例如, if(true) PRINTF 如果这时printf中含有2两以上代码,那么就会导致只...
可变参数:关于宏定义的可变参数的关键是定义的时候使用省略号,引用的时候使用_ _VA_ARGS_ _ ,例如: //本例子摘自C99:6.10.3.5 - EXAMPLE 7 //定义: #define debug(...) fprintf(stderr, _ _VA_ARGS_ _) //使…
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件。 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。
2. GCC 的复杂宏 GCC使用一种不同的语法从而可以使你可以给可变参数一个名字,如同其它参数一样。 #definedebug(format, args...) fprintf (stderr, format, args) 这和上面举的那个定义的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述。