对使用STR(...) #__VA_ARGS__宏输出的字符串的探讨,别有一番风味。
1. 使用以下宏的对照结果
#define STR(...) #__VA_ARGS__
1.1 对照1
分析:左括号(与右括号)空格被忽略。
序号代码输出结果
1STR(1,2,3)"1,2,3"2STR(1, 2, 3)"1, 2, 3"3STR(1 , 2 , 3)"1 , 2 , 3"4STR( 1 , 2 , 3 )"1 , 2 , 3"
1.2 对照2
分析: 单个参数至多保留一个空格。
STR(( 1 , 2 , 3 ))
输出:
"( 1 , 2 , 3 )"
1.3 对照3
分析:单个参数代码换行,实际不换行,多个空格变为一个空格。
STR(1
2
3)
输出:
"1 2 3"
1.4 对照4
分析:\n实际显示的字符会被保留(与1.3成对照组)。
STR(1\n
2\n
3\n
)
输出:
"1\n 2\n 3\n"
1.5 对照5
分析:带双引号会被转义。
STR(1, "2", '3')
输出:
"1, \"2\", '3'"
2. 一些语法解释
...当我们无法列出传递的所有参数的类型和数目时用于占位符的作用;#为把参数转换成字符串;__VA_ARGS__为可变参数宏,一些使用场景:
fprintf(stdout, format
, __VA_ARGS__
)
3. 最后
在实际很少很少用到它,很多时候了解就可以了;倒是这一条宏#define STR(...) #__VA_ARGS__可以学习下。
4. 关于
文章首发于微信公众号你才小学生后续更新于Qtbig哥(qtbig.com)