C 和C ++标准都包含文本,如果stringize操作无法生成有效的字符串文字标记,则行为未定义。在C ++ 11中,这实际上是可行的,方法是在原始字符串文字中包含换行符。但是,标准中始终存在着这一切。
有没有其他方法可以生成UB,其中UB或格式错误的程序尚未发生?
我很想知道任何方言 C 或C ++。我是writing预处理器。
答案 0 :(得分:4)
stringify(#
)运算符仅在字符串常量中转义\
。实际上,\
在字符串常量之外没有特别的意义,除了在一行的末尾。因此,它是一个预处理令牌(C节6.4,C ++第2.5节)。
因此,如果我们有
#define Q(X) #X
然后
Q(\)
是合法调用:\
是一个永不转换为令牌的预处理令牌,因此它是有效的。但你无法将\
字符串化;这将给你“\”这不是一个有效的字符串文字。因此,上述行为尚未定义。
这是一个更有趣的测试案例:
#define Q(A) #A
#define ESCAPE(c) Q(\c)
const char* new_line=ESCAPE(n);
const char* undefined_behaviour=ESCAPE(x);
一个不太有趣的未定义stringify的情况是stringified参数太长而不能成为字符串文字。 (标准建议字符串文字的最大大小至少为65536个字符,但不要说宏参数的最大大小,这可能更大。)