7

C和 C++ 标准都包含文本,大意是如果字符串化操作未能生成有效的字符串文字标记,则行为未定义。在 C++11 中,这实际上是可能的,方法是在原始字符串文字中包含换行符。但标准中始终存在包罗万象的内容。

有没有其他方法可以使字符串化产生 UB,而 UB 或格式错误的程序还没有发生?

我很想听听C或 C++ 的任何方言。我正在一个预处理器。

4

1 回答 1

5

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

因此,如果我们有

#define Q(X) #X

然后

Q(\)

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

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

#define Q(A) #A
#define ESCAPE(c) Q(\c)
const char* new_line=ESCAPE(n);
const char* undefined_behaviour=ESCAPE(x);

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

于 2013-07-02T06:08:28.353 回答