stringify 运算符如何扩展 TABS?

raf*_*foo 2 c++ c-preprocessor

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" ?
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 6

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

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

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