2012-11-17 42 views
1

铛具有以下测试案例:#else 1只是一个警告?

#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

微软的C/C++编译器是众所周知的,因为根据标准,许多这不完全正确。我想你必须忍受它,或者切换到更严格的编译器。 – Lindydancer

回答

4

该标准没有“错误”和“警告”的概念,它只知道“诊断”。确定构成诊断的是实施。 C的大多数实现(包括clang和gcc)都将诊断定义为包含错误和警告。

+0

而gcc的'-pedantic-errors'选项会导致它将所有语言要求的诊断视为致命错误。 –

+0

而VC++具有相同的'/ WX'选项来将所有警告视为错误。 –

+1

对于这个问题,gcc有相当的'-Werror'选项将* all *警告视为错误。 '-pedantic-errors'适用于那些想在代码中允许一些警告的人,但是想拒绝那些实际上不合格的代码。例如,他们的代码可能包含像“if(a = b);'这样令人怀疑的构造,它会破坏gcc推荐的样式指南,或者不那么可疑的构造触发他们不同意的其他警告,但无论出于何种原因他们不想必须禁用/解决警告只是为了获得编译。 –

相关问题