PP_ARG_N(...)会展开为该宏调用中参数的个数,它利用PP_ARG_X宏作为辅助,PP_ARG_X有M+2个固定参数,再加一个可变参数列表,其展开为固定参数列表的最后一个参数 XX。 当通过PP_ARG_N给PP_ARG_X传递的变参列表__VA_ARGS__代表的参数列表长度为 N 时,PP_ARG_X的参数 XX 将展开为 N,于是我们就得到...
(1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。如果调用:debug2("code = %d",100); 这样调用没有问题。 如果调用:debug2("hello"); 这里调用时,在format后面没有传入任何参数,那么就会编译错误,因为在宏替换之后变成了pr...
变参宏的实现形式其实跟变参函数差不多:用… 表示变参列表,变参列表由不确定的参数组成,各个参数之间用逗号隔开。可变参数宏使用 C99 标准新增加的一个 VA_ARGS 预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list、va_start、va_end 这些宏去解析变参列表。预处理器在将宏展开...
C语言的宏文本替换,是通过预处理指令define实现的,#define的使用场景主要有:1)直接使用标识符不定义具体常量的标识符用法 2)替换常量的对象式宏(Object-like macros)3)模拟函数功能的函数式宏(Function-like macros)4)替换文中支持可变的参数数量的可变参宏 5)#和##运算法的用法等。define 标识符 当用...
经常看到源码的宏定义,一直不清楚 ## , _VA_ARGS , ... , args... 的作用是什么,记录下。 1999 年的 ISO C 标准里规定了可变参数宏,语法和函数类似,比如: #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 其中的“...”表示可变参数,实际调用时,它们会替代宏体里的__VA_...
可变参数宏 #define __var_macro(...) __VA_ARGS__ 其中__VA_ARGS__替换...传入参包括参数之间的分隔符,如__var_macro(123,456)中的...=123,456 可变参数函数 可变参数函数形式如下void foo(int param1 , ...),使用可变参数函数的4个关键变量和宏是 ...
C语言变参宏 背景: C语言,GCC4.6,测试环境VS6.0 模拟printf的入参形式,达到如下目的: 某系统日志函数入参过多,在同一模块有很多重复的参数,希望能够减少输入,按照const char *format, ...的形式输入需要显示的内容。 研究结果: 在GCC编译环境下 使用GCC的变参宏(Varadic Macros)扩展实现:...
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 假如我们将上面的代码稍作一下修改,变成下面的样子。 #define OUTSCREEN(msg, ...) printf(msg, __VA_ARGS__) int main(int argc, char* argv[]) { ("Hello World!"); ...
在使用可变参数宏的过程中,我们不仅可以传多个参数,也可以传入0个参数,比如 debug("debug"); 然而当我们真的这样做的时候,编译器会报一个错误,原因是因为进行宏替换以后变成了如下的形式: printf("debug",); __VA_ARGS__会替换为与省略号匹配的所有参数,同时会将省略号前面的一个逗号带上,在如果不带任何参...
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。