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

Configure $(CC) to warn when inclusion is safe to be removed

阅读此源代码文档:

// 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 也一样吗?

编译器算出来的成本高吗?

您会考虑激活该功能吗?

根据 Peter 的评论,我将解决第三个问题,即有关成本的问题。 TL;DR:这不是添加到编译器中的微不足道的功能。

目前,编译器只是逐行处理源代码,将#includes 作为一种获取不同源代码的方式,并将其插入输入流中的适当位置。这都由预处理器处理。

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

要执行 OP 要求的操作,需要为每个单独的声明添加元数据,以指定在哪个文件中找到它。然后在处理源时,有必要标记每一个被使用的声明。然后最后在编译结束时,编译器将不得不 运行 遍历整个符号 table,以查看是否有任何文件具有其中 none 的符号的条件使用过。

这不是 "five line of code" 修复,这将是一笔相当大的投资。

我刚才概述的内容并未开始处理嵌套的#includes。假设 outer.c 包括 middle.h。现在 middle.h 中没有任何在 outer.c 中使用的符号,但它确实包含使用的 inner.h。因此,如果不将 "route" 保存到每个变量,您就有可能丢弃 middle.h 并因此丢失 inner.h.