如何让gcc和clang为非当前目录中的头文件包含的头文件生成警告? 我使用的是gcc 4.9.2和clang 3.6.0。
例如,假设./include_a.c
包含./dir/a.h
,./dir/a.h
包含./b.h
,./b.h
预计会为-Wconversion
生成警告;那么,gcc和clang -Wconversion
在编译include_a.c
时不会产生预期的警告。使用-Wconversion -Wsystem-headers
,会生成预期的警告,但通常会出现许多对系统标头无用的警告。如果./b.h
直接包含在当前目录中的源文件中(例如./include_b.c
),则会生成不带-Wsystem-headers
的预期警告。
以下shell脚本再现了此示例(省略了clang的情况):
#!/bin/sh
mkdir dir
echo '#include "b.h"' >dir/a.h
echo 'void f() {int a = 0; char b = a;}' >b.h
echo '#include "dir/a.h"' >include_a.c
echo '#include "b.h"' >include_b.c
set -x
gcc -c include_a.c -Wconversion # DOES NOT generate a warning
gcc -c include_a.c -Wconversion -Wsystem-headers # generate a warning
gcc -c include_b.c -Wconversion # generate a warning
输出:
+ gcc -c include_a.c -Wconversion
+ gcc -c include_a.c -Wconversion -Wsystem-headers
In file included from dir/a.h:1:0,
from include_a.c:1:
./b.h: In function ‘f’:
./b.h:1:31: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
void f() {int a = 0; char b = a;}
^
+ gcc -c include_b.c -Wconversion
In file included from include_b.c:1:0:
b.h: In function ‘f’:
b.h:1:31: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
void f() {int a = 0; char b = a;}
^
这种行为似乎不是一个错误,因为gcc和clang以相同的方式执行,但我如何从所有源文件中获取警告?