配置 $(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
.
阅读此源代码文档:
// 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
.