非当前目录中标题包含的标题没有警告

时间:2015-06-19 02:35:37

标签: c gcc clang compiler-flags

如何让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以相同的方式执行,但我如何从所有源文件中获取警告?

0 个答案:

没有答案