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对系统和非系统文件的行为有所不同?
答案 0 :(得分:2)
Clang默认禁止系统头的警告。它似乎认为C ++ 11缩小了非致命错误,并在此上下文中禁止对此进行诊断。
根据the manual,当标题为#include
d时,从一个被认为是系统的目录(-Isystem
指定)中看到这个,你需要启用它选项:
-Wsystem-headers
从系统标头启用警告。
这个标志可能是继承自GCC的was added in 2000。 rationale就是:
声明操作系统和运行时库接口的头文件通常不能严格符合C语言编写。因此,GCC会在系统头文件中给出代码特殊处理。除了“
#warning
”(参见Diagnostics)生成的警告之外的所有警告都会被抑制,而GCC正在处理系统标头。系统标题中定义的宏在任何扩展的位置都不受几个警告的影响。 [...]
m7913d found Clang文档的等效部分,它没有像GCC那样提供更多的说明:
可在此处找到更多信息:Controlling Diagnostics in System Headers
但核心结果是一样的:
警告在系统标题中出现时会被禁止。
而且,正如我们所看到的,Clang似乎认为C ++ 11缩小不是一个硬错误,并且在没有-Wsystem-headers
的情况下将其抑制为系统头。