以下是代码:
#include <stdio.h>
#define f(x,y) \x##y
int main(int argc, char* argv[])
{
return 0;
}
f(,)
我的朋友问我这个问题,但我没有明确的答案。
答案 0 :(得分:2)
反斜杠是一个有效的预处理程序标记(“每个非空白字符不能是上述之一”)但它不能转换为任何有效标记(它不在punctuator
列表中S)。除了在行尾使用外,反斜杠在字符和字符串文字之外的C程序中没有任何特殊意义。
因此,宏替换将不符合§6.4.1第2段的要求:
转换为令牌的每个预处理令牌都应具有关键字,标识符,常量,字符串文字或标点符号的词法形式。
所以程序结构不合理。如果生成了可执行文件,则尝试执行它将具有未定义的行为。
如果不是反斜杠,程序将是格式良好的。两个空宏参数的令牌连接是明确定义的;它什么也没用。