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