#define foo 1 ## ## 2会导致未定义的行为吗?

时间:2018-05-21 05:15:50

标签: c c-preprocessor language-lawyer

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,就好像只有一个##一样。这是预期的产出吗?

0 个答案:

没有答案