阅读此源代码文档:
// 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有什么影响?
编译器找出问题的成本很高吗?
您是否会考虑激活该功能?
答案 0 :(得分:2)
在扩展Peter的评论的同时,我要解决第三个问题,这涉及到成本。 TL; DR:这不是添加到编译器中的琐碎功能。
当前,编译器只是简单地逐行处理源代码,将#includes视为获取另一个源代码并将其插入输入流中适当位置的一种方式。这些全部由预处理器处理。
它甚至可以添加一些特殊的指令(通常是#line),以使错误消息与它们的实际发生位置相匹配,仅此而已。
执行OP所需的操作是,每个声明都添加了元数据,以指定在哪个声明中找到该文件。然后,在处理源时,必须标记每个使用的声明。然后最后在编译结束时,编译器将不得不在整个符号表上运行,以查看是否有文件存在其中未使用任何符号的情况。
这不是“五行代码”修复,这将是一笔相当大的投资。
我刚才概述的内容并没有开始处理嵌套的#includes。假设outer.c
包括middle.h
。现在middle.h
中没有outer.c
中使用的任何符号,但是它确实包含使用的inner.h
。因此,如果不为每个变量保存“路由”,则可能会丢掉middle.h
,从而丢掉inner.h
。