VA_ARGS是一个可变参数的宏,是新的 C99 规范中新增的,目前似乎只有 gcc 支持( VC 从 VC2005 开始支持)。 VA_ARGS需要配合 define 使用,总体来说就是将左边宏中 .. 的内容原样抄写在右边VA_ARGS所在的位置; 举个例子: #definemyprintf(...)printf( __VA_ARGS__) 示例代码如下: /***/ //@Author:猿...
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。比如: #define...
对于第1次调用,__VA_ARGS__展开为1个参数:"Howdy"。 对于第2次调用,__VA_ARGS__展开为3个参数:"Weight = %d, shipping = $%.2f\n"、wt、sp。 因此,展开后的代码是: printf("Howdy"); printf("Weight = %d, shipping = $%.2f\n", wt, sp); 演示用例如下: // variadic.c -- variadic ...
- %s/%s \n",##__VA_ARGS__,__LINE__,__TIME__,__DATE__)); int main() { //可变参数 LOGFUNC2("i am C++ :%d name:%s age:%d",112,"C语言教程",18)// ok //字符串常量 LOGFUNC2("i am C++ ");// ok } /* 输出结果: i am C++ :112 name:C语言教程 age:18 line:7 -...
举例来说,一个使用#__VA_ARGS__的宏定义可以是这样的: #define CONCAT(a, b, c) a##b##c #define MESSAGE(x) #x int main() { printf("%s\\\n", MESSAGE(CONCAT(Hello, World, !))); return 0; } 在这个例子中,CONCAT宏定义使用了##操作符将三个字符串常量拼接在一起,MESSAGE宏定义则使用...
//遍历不定参数,不定参数展开 <=9个 //vs中这种方式定义宏过度也不能用 //Parameters Table // Parameters Name // 计算 VA_ARGS 参数个数,最大支持64个参数 //vs中无参数时会返回1 { if (pImpl != NULL) { return pImpl->funcName(PARAM_NAME_FOR_EACH_(EXTAND_ARGS(...
在C语言中,如果你需要处理一些不确定数量的参数,那么__va_args__就是你的最佳选择。它允许你在函数调用时接受任意数量的参数,并将其存储在一个数组中。 一、基本用法 在使用__va_args__之前,你需要了解一些基本的C语言可变参数函数的用法。可变参数函数通常在模板中使用,但直接在普通函数中使用也很常见。要...
在探讨Visual Studio中可变宏参数__VA_ARGS__展开的问题时,我们面临的是一个跨编译器的差异。当宏A具有可变参数,且在宏定义中将可变参数__VA_ARGS__传递给宏B时,这种行为在gcc或clang编译器中表现良好,__VA_ARGS__会被正确展开为实际参数,B在处理其参数时,将其视为多个变量处理。然而,在...
__VA_ARGS__)#else #define LOG(priority, tag, fmt, ...) ((void)(0))#endif 但是在gcc下,如果调⽤的时候没有后⾯的可变参数,会编译错误,⽽ VC9 不会。gcc做了扩展可以使⽤##来消除这个错误,也就是改成这样:#define LOG(priority, tag, fmt, ...) __android_log_print(priori...
[__VA_ARGS__](https://www.codersrc.com/archives/9450.html)在前面的文章也介绍了,有两个缺点: 1.仅仅只支持字符串常量,不支持可变参数 #define LOGFUNC(...) (printf(__VA_ARGS__)) 1. 2.仅仅只支持可变参数,不支持字符串常量 ...