Clang为系统包含文件返回不同的编译器错误

时间:2017-06-29 12:15:36

标签: c++11 clang

main.cpp中:

include()

包括/ test.h:

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

当将void narrowingConversion () {int i = 1; char a[1] = {i};} 文件夹包含为系统文件夹时,Clang会成功编译上述代码:

include

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

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

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

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

1 个答案:

答案 0 :(得分:2)

Clang默认禁止系统头的警告。它似乎认为C ++ 11缩小了非致命错误,并在此上下文中禁止对此进行诊断。

根据the manual,当标题为#include d时,从一个被认为是系统的目录(-Isystem指定)中看到这个,你需要启用它选项:

  

-Wsystem-headers

     

从系统标头启用警告。

这个标志可能是继承自GCC的was added in 2000rationale就是:

  

声明操作系统和运行时库接口的头文件通常不能严格符合C语言编写。因此,GCC会在系统头文件中给出代码特殊处理。除了“#warning”(参见Diagnostics)生成的警告之外的所有警告都会被抑制,而GCC正在处理系统标头。系统标题中定义的宏在任何扩展的位置都不受几个警告的影响。 [...]

m7913d found Clang文档的等效部分,它没有像GCC那样提供更多的说明:

  

可在此处找到更多信息:Controlling Diagnostics in System Headers

但核心结果是一样的:

  

警告在系统标题中出现时会被禁止。

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