将$(CC)配置为在安全删除包含时发出警告
阅读此源代码文档:将$(CC)配置为在安全删除包含时发出警告,c,gcc,include,llvm,compiler-warnings,C,Gcc,Include,Llvm,Compiler Warnings,阅读此源代码文档: // foo.c #include<stdint.h> main(){} GCC编译时没有警告 让我们修改源代码: // foo.c main(){} 但同样的情况也发生了: $ gcc -Wno-implicit-int foo.c $ ./a.out $ gcc -dumpversion 6.3.0 输出是相同的。我想相信这意味着包涵体可以安全移除 我可以配置GCC以警告可以安全删除此类包含吗? LLVM也一样吗? 编译器需要花费高昂的代价才能弄清楚吗?
// foo.c
#include<stdint.h>
main(){}
GCC编译时没有警告
让我们修改源代码:
// foo.c
main(){}
但同样的情况也发生了:
$ gcc -Wno-implicit-int foo.c
$ ./a.out
$ gcc -dumpversion
6.3.0
输出是相同的。我想相信这意味着包涵体可以安全移除
我可以配置GCC以警告可以安全删除此类包含吗?
LLVM也一样吗?
编译器需要花费高昂的代价才能弄清楚吗?
<强>你会考虑激活这个特性吗?< /强>
< P >扩展彼得的评论,我将讨论第三个问题,关于这个代价。TL;DR:这不是添加到编译器中的微不足道的功能 目前,编译器只是逐行处理源代码,将#includes作为一种方式来获取不同的源代码,并将其插入到输入流中的适当位置。这一切都由预处理器处理 它甚至添加了一些特殊指令(通常是#行),以便错误消息与它们实际发生的位置相匹配,但仅此而已 OP要求做的是在每个声明中添加元数据,指定在哪个文件中找到它。然后,在处理源代码时,有必要标记每个使用的声明。最后,在编译结束时,编译器将不得不运行整个符号表,以查看是否有任何文件具有从未使用过其中任何符号的条件 这不是一个“五行代码”修复,而是一个相当大的投资我刚才概述的内容并没有开始涉及嵌套的包含。假设
outer.c
包括middle.h
。现在,middle.h
中没有任何在outer.c
中使用的符号,但它确实包括使用的inner.h
。因此,如果不保存每个变量的“路由”,您就有可能丢弃middle.h
,从而丢失internal.h
,我刚刚在第二个示例中使用GCC-Wall
(Linux/Debian/Sid/AMD64)尝试了GCC 8.2。我得到一个警告。你的GCC6变老了。升级它!如果出现错误,编译器往往会发出诊断(错误),如果代码可能不正确或不明确,则会发出警告。包含一个不需要的头既不是-实际上,编译器通常甚至不会尝试检测是否可以删除“包含”,也不会提供一个选项来警告这样的事情。@BasileStrynkevich禁止警告的是-Wno implicit int
,而不一定是编译器版本。我可以通过使用/不使用gcc 7.3上的选项来综合OP的结果或您的结果。1@Peter好吧,我想这就是答案!这甚至不是有效的C代码。您的main
缺少结果类型,这是自19年(C99)以来不允许的。显式选项不应该有ned。那么包含是什么意思?这与#include
前处理器指令有什么关系?为什么要禁用该警告?
$ gcc -Wno-implicit-int foo.c
$ ./a.out
$ gcc -dumpversion
6.3.0