Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将$(CC)配置为在安全删除包含时发出警告_C_Gcc_Include_Llvm_Compiler Warnings - Fatal编程技术网

将$(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