关于字符串输出的另类探讨

    xiaoxiao2025-08-02  23

    对使用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)
    最新回复(0)