此代码中是否有UB?

时间:2017-01-25 23:23:26

标签: c directive

以下是代码:

#include <stdio.h>
#define f(x,y) \x##y

int main(int argc, char* argv[])
{

    return 0;
}
f(,)

我的朋友问我这个问题,但我没有明确的答案。

1 个答案:

答案 0 :(得分:2)

反斜杠是一个有效的预处理程序标记(“每个非空白字符不能是上述之一”)但它不能转换为任何有效标记(它不在punctuator列表中S)。除了在行尾使用外,反斜杠在字符和字符串文字之外的C程序中没有任何特殊意义。

因此,宏替换将不符合§6.4.1第2段的要求:

  

转换为令牌的每个预处理令牌都应具有关键字,标识符,常量,字符串文字或标点符号的词法形式。

所以程序结构不合理。如果生成了可执行文件,则尝试执行它将具有未定义的行为。

如果不是反斜杠,程序将是格式良好的。两个空宏参数的令牌连接是明确定义的;它什么也没用。