关于字符串输出的一些探讨

对使用STR(...) #__VA_ARGS__宏输出的字符串的探讨,别有一番风味。

1. 使用以下宏的对照结果

1
#define STR(...) #__VA_ARGS__

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
    3
    STR(1
    2
    3)
  • 输出:

    1
    "1 2 3"

1.4 对照4

  • 分析:\n实际显示的字符会被保留(与1.3成对照组)。

    1
    2
    3
    STR(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)