首页 > 解决方案 > stringify 运算符如何扩展 TABS?

问题描述

GCC 似乎总是用空格扩展源代码中的选项卡。它保留了表达式内部的空间。标准对此有何规定?

例如,c此示例中将包含的内容(<TAB>表示\t源代码文件中的文字字符)。

#define X(a) #a

const char* c = X(<TAB>a<TAB>c<TAB>);
// c == "a c" ? (looks like what gcc does)
// c == "a\tc" ?

标签: c++c-preprocessor

解决方案


查阅C++ 标准(草案)的部分[cpp.stringize]告诉我们:

字符串化参数的预处理标记之间每次出现的空格都会成为字符串文字中的单个空格字符。删除第一个预处理标记之前和包含字符串化参数的最后一个预处理标记之后的空白。

鉴于: <TAB>a<TAB>c<TAB>,第一条规则意味着我们将拥有" a c ",但第二条规则意味着我们将删除前导和尾随空格,"a c"如您所见。


推荐阅读