VA_ARGS是一个可变参数的宏,是新的 C99 规范中新增的,目前似乎只有 gcc 支持( VC 从 VC2005 开始支持)。 VA_ARGS需要配合 define 使用,总体来说就是将左边宏中 .. 的内容原样抄写在右边VA_ARGS所在的位置; 举个例子: #definemyprintf(...)printf( __VA_ARGS__) 示例代码如下: /***/ //@Author:猿...
对于第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 ...
说到这里,有必要提一下“##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args,__VA_ARGS都可以看作是token,如果token为空,“##”则不进行连接,所以允许省略可变参数。对上述2个示例的改造: #defineLOG(format, ...) fprintf(stdout, format, ##__VA_ARGS__)#defineLOG(format, args....
举例来说,一个使用#__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宏定义则使用...
printf(fmt,__VA_ARGS__)新的C99规范⽀持了可变参数的宏 具体使⽤如下:以下内容为程序代码:#include <stdarg.h> #include <stdio.h> #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)int main() { LOGSTRINGS("hello, %d ", 10); return 0; } 但现在似乎只有gcc才⽀持。
二.##__VA_ARGS__经典案例 有时,我们想把调试信息输出到屏幕上,而有时则又想把它输出到一个文件中,可参考下面的例子: AI检测代码解析 /***/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:C语言教程 - C语言 函数不定长参数 ##__VA_ARGS__经典...
//遍历不定参数,不定参数展开 <=9个 //vs中这种方式定义宏过度也不能用 //Parameters Table // Parameters Name // 计算 VA_ARGS 参数个数,最大支持64个参数 //vs中无参数时会返回1 { if (pImpl != NULL) { return pImpl->funcName(PARAM_NAME_FOR_EACH_(EXTAND_ARGS(...
字符串化#、拼接字符##和可变参数宏(...和__VA_ARGS__)宏定义的使⽤与注意事项 ##是⼀个连接符号,⽤于把参数连在⼀起 #是“字符串化”的意思。出现在宏定义中的#是把跟在后⾯的参数转换成⼀个字符串 #define paster( n ) printf( "token " #n" = %d\n ", token##n )所以paster(...
token)就是指编译器能够识别的最小语法单元; #define LOG2(x) log##x() // __VA_ARGS_
define 宏定义 执行时间:编译时执行替换 特殊符号:# 作用:用来把参数转化为字符串示例: 特殊符号:## 作用:用来把参数进行连接示例: 特殊符号:VA_ARGS 作...