使操作失败
C和C ++标准都包含文字,表明如果字符串操作无法生成有效的字符串文字标记,则行为是未定义的。 在C ++ 11中,这实际上是可行的,通过在原始字符串文字中包含换行符。 但是标准中总是存在一揽子标准。
有没有其他方式可以产生UB,UB还是一个不合格的程序尚未发生?
我有兴趣听听有关C或C ++的任何方言。 我在写预处理器。
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);
一个不太有趣的未定义字符串化的情况是字符串化参数太长而不能成为字符串字符串的地方。 (这些标准建议字符串文字的最大大小至少为65536个字符,但不要说宏观参数的最大大小,这可能大一些。)
链接地址: http://www.djcxy.com/p/72465.html