鉴于:
#error /*
*/ foo
Run Code Online (Sandbox Code Playgroud)
Microsoft C++输出错误消息/*
和GCC输出foo
.
哪个是对的?
GCC是正确的.
替换注释(包括换行符)发生在翻译阶段3,翻译阶段4中的预处理(ISO/IEC 9899:1999,§5.1.1.2).
因此,编译器的预处理部分不再"看到"换行符.
并且,#error
定义如下(§6.10.5):
表单的预处理指令
# error pp-tokens_opt new-line
使实现生成包含指定序列的预处理标记的诊断消息.
所以,foo
必须是输出的一部分.