6.11.3.3的c11规范说
删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接在一起。 [...]如果结果不是有效的预处理令牌,则行为未定义。
所以1 ####将替换为1 ##,这不是有效的预处理令牌,因此行为未定义。 这是对的吗?
#include <stdio.h>
int main()
{
#define foo 1 ## ## 2
printf("%d\n", foo);
return 0;
}
使用gcc -std=c11 -Wall -Wpedantic
编译上述内容并未发出任何警告,输出为12,就好像只有一个##
一样。这是预期的产出吗?