鉴于:
#error /*
*/ foo
Microsoft C++ 输出错误消息/*
和 GCC 输出foo
。
哪个是对的?
海湾合作委员会是正确的。
注释的替换(包括换行符)发生在翻译阶段 3,预处理在翻译阶段 4 (ISO/IEC 9899:1999, §5.1.1.2)。
因此,编译器的预处理部分不再“看到”换行符。
并且,#error
定义如下(§6.10.5):
形式的预处理指令
# error pp-tokens_opt new-line
导致实现产生一个诊断消息,其中包括指定的预处理令牌序列。
所以,foo
必须是输出的一部分。
GCC 是正确的,因为它应该被/ * ... * /
标准中的单个空格替换。