配置$(CC)在安全删除包含内容时发出警告

时间:2018-08-23 19:25:36

标签: c gcc include llvm compiler-warnings

阅读此源代码文档:

// foo.c
#include<stdint.h>
main(){}

我可以这样做:

$ gcc -Wno-implicit-int foo.c
$ ./a.out
$ gcc -dumpversion
6.3.0

GCC编译时没有警告。

让我们修改源代码:

// foo.c
main(){}

但同样的事情发生了:

$ gcc -Wno-implicit-int foo.c
$ ./a.out
$ gcc -dumpversion
6.3.0

输出是相同的。我想相信,这意味着可以安全地除去内含物。

我可以配置GCC来警告可以安全删除此类包含项吗?

对LLVM有什么影响?

编译器找出问题的成本很高吗?

您是否会考虑激活该功能?

1 个答案:

答案 0 :(得分:2)

在扩展Peter的评论的同时,我要解决第三个问题,这涉及到成本。 TL; DR:这不是添加到编译器中的琐碎功能。

当前,编译器只是简单地逐行处理源代码,将#includes视为获取另一个源代码并将其插入输入流中适当位置的一种方式。这些全部由预处理器处理。

它甚至可以添加一些特殊的指令(通常是#line),以使错误消息与它们的实际发生位置相匹配,仅此而已。

执行OP所需的操作是,每个声明都添加了元数据,以指定在哪个声明中找到该文件。然后,在处理源时,必须标记每个使用的声明。然后最后在编译结束时,编译器将不得不在整个符号表上运行,以查看是否有文件存在其中未使用任何符号的情况。

这不是“五行代码”修复,这将是一笔相当大的投资。

我刚才概述的内容并没有开始处理嵌套的#includes。假设outer.c包括middle.h。现在middle.h中没有outer.c中使用的任何符号,但是它确实包含使用的inner.h。因此,如果不为每个变量保存“路由”,则可能会丢掉middle.h,从而丢掉inner.h