Stringize运算符失败

Pot*_*ter 7 c c++ stringification c-preprocessor

Ç和C++标准都包括文本,如果stringize操作未能出示有效的字符串文字令牌,该行为是不确定的影响.在C++ 11中,这实际上是可行的,方法是在原始字符串文字中包含换行符.但是,标准中始终存在着这一切.

有没有其他方式stringize可以产生UB,其中UB或一个不正确的程序尚未发生?

我很想知道任何C或C++的方言.我正在一个预处理器.

ric*_*ici 5

stringify ( #) 运算符仅\在字符串常量中转义。实际上,\除了在行尾之外,在字符串常量之外没有特别的意义。因此,它是一个预处理标记(C 部分 6.4,C++ 部分 2.5)。

因此,如果我们有

#define Q(X) #X
Run Code Online (Sandbox Code Playgroud)

然后

Q(\)
Run Code Online (Sandbox Code Playgroud)

是一个合法的调用:这\是一个预处理令牌,它永远不会转换为令牌,所以它是有效的。但是你不能字符串化\;这会给你“\”,它不是一个有效的字符串文字。因此,上述行为是未定义的。

这是一个更有趣的测试用例:

#define Q(A) #A
#define ESCAPE(c) Q(\c)
const char* new_line=ESCAPE(n);
const char* undefined_behaviour=ESCAPE(x);
Run Code Online (Sandbox Code Playgroud)

未定义字符串化的一个不太有趣的情况是字符串化参数太长而不能成为字符串文字。(标准建议字符串文字的最大大小至少为 65536 个字符,但没有提及宏参数的最大大小,这可能会更大。)