【问题标题】:Clang returns different compiler errors for system include filesClang 为系统包含文件返回不同的编译器错误
【发布时间】:2017-09-21 18:15:10
【问题描述】:

main.cpp:

#include "test.h"
void main () {narrowingConversion ();}

包括/test.h:

void narrowingConversion () {int i = 1; char a[1] = {i};}

当将include文件夹包含为系统文件夹时,Clang成功编译上述代码:

clang++ -std=c++0x -isystem./include main.cpp

但是正常包含文件夹时clang失败:

clang++ -std=c++0x -I./include main.cpp

./include/test.h:1:54: 错误:在初始化列表 [-Wc++11-narrowing] 中,非常量表达式不能从类型 'int' 缩小到 'char'

问题:为什么系统文件和非系统文件的 clang 行为不同?

【问题讨论】:

  • @jens 你确定这与c 无关吗? c警告/错误也可能出现此问题。
  • @m7913d 人们对于删除 C 或 C++ 标记的问题非常反身,因为他们不会立即看到两者的相关性。我知道这是基于错误标记的合法实例,但我认为人们过度纠正了。但是,在这种情况下,我可以看到他们的观点:虽然我很确定这对于 C 来说是相同的,但没有 Clang 的示例表现出相同的行为,所写的问题只是关于 C++。

标签: c++11 clang


【解决方案1】:

默认情况下,Clang 禁止对系统标头发出警告。它似乎认为 C++11 缩小了一个非致命错误,并在这种情况下抑制了关于该错误的诊断。

根据the manual,当标头为#included 时来自被视为系统目录(-Isystem 指定)的目录时,要查看此内容,您需要启用此选项:

-Wsystem-headers

启用来自系统标头的警告。

这个标志可能是从 GCC 继承而来的,它 was added in 2000rationale 是:

声明操作系统和运行时库接口的头文件通常不能用严格符合的 C 语言编写。因此,GCC 对系统头文件中的代码进行特殊处理。在 GCC 处理系统标头时,所有警告,除了由“#warning”(参见Diagnostics)生成的警告外,都会被抑制。系统标头中定义的宏在扩展时不受一些警告的影响。 […]

m7913dfound Clang 文档的等效部分,它没有像 GCC 那样给出太多说明:

更多信息可以在这里找到:Controlling Diagnostics in System Headers

但核心结果是一样的:

警告在系统标头中出现时会被禁止显示。

而且,正如我们所见,Clang 似乎认为 C++11 缩小不是一个硬错误,并在没有 -Wsystem-headers 的情况下为系统标头抑制它。

【讨论】:

  • 不错的假设,但看起来它是一个错误,而不仅仅是一个警告
  • 我认为,除非另有说明,否则该横幅下至少还包含一些错误。例如,C++11 缩小错误只需要一个模糊定义的“诊断”,而不是编译失败。也许这就是其中的因素。当然,您可以通过在原始案例中添加 -Wsystem-headers 并查看其内容来测试它。
  • 添加-Wsystem-headers确实会导致缩小错误,即使对于系统文件也是如此。
  • 更多信息可以在这里找到:Controlling Diagnostics in System Headers
  • 感谢您的确认和额外的链接!我也会将其添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多