Clang有以下测试用例:
#if 0
#ifdef D
#else 1 // Should not warn due to C99 6.10p4
#endif
#endif
#if 0
#else 1 // expected-warning {{extra tokens}}
#endif
第一个#else 1
确实很好,因为它在跳过的组中,但据我所知,第二个应该是一个错误 - 它与标准指定的预处理器指令的语法不匹配 - 但GCC和Microsoft C ++同意仅发出警告。我错过了什么?
答案 0 :(得分:4)
标准没有“错误”和“警告”的概念,它只知道“诊断”。由实现来定义诊断的构成。 C的大多数实现(包括clang和gcc)定义诊断以包括错误和警告。