对使用
STR(...) #__VA_ARGS__
宏输出的字符串的探讨,别有一番风味。
#define STR(...) #__VA_ARGS__
(
与右括号)
空格被忽略。序号 | 代码 | 输出结果 |
---|---|---|
1 | STR(1,2,3) | "1,2,3" |
2 | STR(1, 2, 3) | "1, 2, 3" |
3 | STR(1 , 2 , 3) | "1 , 2 , 3" |
4 | STR( 1 , 2 , 3 ) | "1 , 2 , 3" |
STR(( 1 , 2 , 3 ))
"( 1 , 2 , 3 )"
STR(1
2
3)
"1 2 3"
\n
实际显示的字符会被保留(与1.3成对照组)。STR(1\n
2\n
3\n)
"1\n 2\n 3\n"
STR(1, "2", '3')
"1, \"2\", '3'"
...
当我们无法列出传递的所有参数的类型和数目时用于占位符的作用;#
为把参数转换成字符串;__VA_ARGS__
为可变参数宏,一些使用场景:fprintf(stdout, format, __VA_ARGS__)
#define STR(...) #__VA_ARGS__
可以学习下。