【问题标题】:How is #else 1 just a warning?#else 1 如何只是一个警告?
【发布时间】:2012-11-05 21:38:22
【问题描述】:

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++ 同意只给它一个警告。我错过了什么?

【问题讨论】:

  • Microsoft 的 C/C++ 编译器以允许许多根据标准不完全正确的内容而闻名。我猜你必须忍受它,或者切换到更严格的编译器。

标签: c syntax c-preprocessor


【解决方案1】:

标准没有“错误”和“警告”的概念,它只知道“诊断”。由实施来定义什么构成诊断。 C 的大多数实现,包括 clang 和 gcc,都定义了包括错误和警告的诊断。

【讨论】:

  • 而 gcc 的 -pedantic-errors 选项会使其将所有语言要求的诊断视为致命错误。
  • 而 VC++ 有等效的/WX 选项,可以将所有警告视为错误。
  • 就此而言,gcc 具有等效的 -Werror 选项,可将 all 警告视为错误。 -pedantic-errors 适用于希望在其代码中允许一些警告但又想拒绝实际上格式错误的代码的人。例如,他们的代码可能包含像 if (a = b); 这样的可疑结构,它们破坏了 gcc 推荐的样式指南,或者触发了他们不同意的其他警告的不太可疑的结构,但无论出于何种原因,他们都不想禁用/解决警告只是为了编译。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多