为啥默认情况下 #include<bits/stdc++.h> 在 Windows 上不起作用?

Posted

技术标签:

【中文标题】为啥默认情况下 #include<bits/stdc++.h> 在 Windows 上不起作用?【英文标题】:Why #include<bits/stdc++.h> does not work by default on windows?为什么默认情况下 #include<bits/stdc++.h> 在 Windows 上不起作用? 【发布时间】:2021-03-28 05:05:25 【问题描述】:

我已经在 windows 上安装了 mingw-w64 编译器。但是在 c++ 程序预处理器指令中使用 #include 总是会出错。如何解决这个问题?

【问题讨论】:

不使用那个? c++ - Why should I not #include <bits/stdc++.h>? - Stack Overflow &lt;bits/stdc++.h&gt; 不是标准 C++,它不必存在。 但是使用#include -- 你从哪里得到使用这个标题的想法?没有好的 C++ 书籍有这个。或者您是否正在尝试从这些“在线竞赛编码”网站之一学习 C++? @PaulMcKenzie:这是竞争(速度)编程世界的标准做法,包括类似的书籍。必须节省那些宝贵的打字时间! 我等不及这些网站使用 C++ 17。然后,在许多情况下,节省键入该标头的所有时间会导致编译器错误,而竞争对手正在为这个问题摸不着头脑,从而浪费时间。特别是如果他们有任何名称为 data 的标识符 【参考方案1】:

bits/stdc++.h 不是标准头文件。因此,除非使用某些特定的编译器,否则不能保证它可以工作。甚至同一编译器的不同版本也可能提供也可能不提供。

当它可用时,bits/stdc++.h 只是 #includes 每个标准 C++ 头文件。这对于刚开始使用该语言的人来说可能是有意义的,因此他们不必担心弄清楚他们需要哪些包括他们不需要哪些。但是使用它会减慢编译时间,在某些情况下可能会使可执行文件比它需要的大,并且(正如您所发现的)使代码不可移植。

对此的唯一解决方案是不使用它,而是使用#include 只是您需要的特定标头。您真的“应该”在编程时这样做;当您需要在标头中声明某个函数时,您可以包含该标头,然后编写函数调用。一些 IDE 会告诉您每个功能需要哪些内容。

但如果你已经把所有的代码都写好了,你就可以作弊。只需删除#include &lt;bits/stdc++.h&gt; 行并尝试编译。如果编译器抱怨缺少或未定义的符号,请搜索该符号以找出它来自哪个标头,并#include 它。冲洗并重复,直到你得到一个干净的编译。

【讨论】:

按照上一段中的步骤将获得要编译的代码,但结果不一定是可移植的。标准库头文件允许定义该头文件不需要的其他符号,因此添加一个头文件可能会修复一些其他缺失的符号。当您移至不同的编译器时,它们将是未定义的,您必须添加更多 #include 指令。 @PeteBecker 是的,这样的事情就是我称之为“作弊”的原因。但我认为这不会太糟糕,因为到那时 OP 将知道如何查找标准头文件。

以上是关于为啥默认情况下 #include<bits/stdc++.h> 在 Windows 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 memset 在这种情况下会失败?

为啥我们不能在动态向量的情况下使用方括号?

为啥我可以在不使用 std::getline 的情况下调用 getline?

为啥 wctype.h 中的函数在没有 setlocale() 的情况下不起作用?

默认情况下为啥没有设置线程化 perl(带有 usethreads)?

为啥 minifyEnabled 在默认情况下在发布版本中为 false?