#include <bits stdc ++。h =“”>如何在C ++中工作?</bits>

时间:2014-08-14 14:46:44

标签: c++ gcc c++11 g++

我已从codeforces博客中读到,如果我们在#include <bits/stdc++.h>程序中C++,则无需包含任何其他标头文件。 #include <bits/stdc++.h>如何工作,是否可以使用它而不是包含单个头文件?

6 个答案:

答案 0 :(得分:95)

它基本上是一个头文件,它还包括每个标准库和stl包含文件。我能看到的唯一目的就是测试和教育。

例如GCC 4.8.0 /bits/stdc++.h source

使用它会包含许多不必要的东西并增加编译时间。

编辑:正如Neil所说,它是预编译头文件的实现。如果将其设置为正确预编译,实际上可以根据您的项目加快编译时间。 (https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

但是我建议你花些时间来了解每个sl / stl标题并分别包含它们,除了预编译之外不要使用“superheaders”。

答案 1 :(得分:30)

#include <bits/stdc++.h>是预编译头的实现文件。

从软件工程的角度来看,最小化包含是个好主意。如果你使用它实际上包含很多文件,你的程序可能不需要,因此不必要地增加编译时间和程序大小。 [编辑:@Swordfish在评论中指出输出程序大小不受影响。但是,最好只包括你真正需要的库,除非是竞争激烈的竞争对手]

但是在竞赛中,当你想减少做家务时浪费的时间时,使用这个文件是个好主意;特别是当您的排名对时间敏感时。

它适用于大多数在线评委,编程竞赛环境,包括ACM-ICPC(次区域,地区和世界总决赛)和许多在线评委。

它的缺点是它

  • 增加了编译时间。
  • 使用GNU C ++库的内部非标准头文件,因此无法在MSVC,XCode和许多其他编译器中编译

答案 2 :(得分:22)

该头文件不是C ++标准的一部分,因此是不可移植的,应该避免使用。

此外,即使标准中有一些catch-all标头,您也希望避免它代替特定标头,因为编译器必须实际读入并解析每个包含的标头(包括递归包含的标头)翻译单位的单次编译。

答案 3 :(得分:3)

基本上,它是一个包含每个标准库的头文件。在编程比赛中,当您要减少浪费在做家务上的时间时,使用此文件是个好主意。特别是当您的排名对时间敏感时。 在编程竞赛中,人们比软件工程更专注于寻找算法来解决问题。从软件工程的角度来看,最好将包含最小化。如果使用它,则实际上包含很多文件,而您的程序可能不需要这些文件,因此不必要地增加了编译时间和程序大小。\

详细了解http://localhost:4000/organizations?page=2&_utf8=%E2%9C%93&name=&address=&city=&state=CA&post=&web=&type=&contact=

这对于排名重要的在线编码是最好的

答案 4 :(得分:1)

不幸的是,这种方法不是可移植的C ++(到目前为止)。

所有标准名称都在名称空间std中,而且您无法知道哪些名称 NOT 由包含和标头定义(换句话说,它对于声明名称的实现来说是完全合法的{使用std::string时直接或间接{1}}。

尽管如此,语言还是要求您知道并告诉编译器哪个标准头包含标准库的哪个部分。这是可移植性错误的来源,因为如果您忘记了例如#include <vector>但是使用#include <map>,那么程序可能会无声地编译,并且在特定版本的特定编译器上没有警告,并且您可能会收到错误仅在以后移植到另一个编译器或版本时。

在我看来,没有有效的技术借口,因为这对于普通用户来说是必要的:编译器二进制文件可以内置所有标准命名空间,这实际上可以比预编译头更多地提高性能(例如,使用完美散列进行查找) ,删除标准头解析或加载/解组等等。)

标准头文件的使用简化了构建编译器或标准库的人员的生活,这就是全部。这不是帮助用户的东西。

然而,这是定义语言的方式,你需要知道哪个标题定义了哪些名称,因此计划在无意义的配置中刻录一些额外的神经元来记住(或尝试查找和自动添加标准标题的IDE)你使用和删除你没有的......一个合理的替代方案。)

答案 5 :(得分:1)

它基本上是一个包含每个标准库的头文件 在编程竞赛中,当你想减少做家务时浪费的时间时,使用这个文件是一个好主意;特别是当您的排名对时间敏感时 在编程竞赛中,人们更关注寻找解决问题的算法,而不是软件工程 但从软件工程角度来看,使用它并不是一个好主意。如果你使用它实际上包含很多文件,你的程序可能不需要,因此不必要地增加了编译时间和程序大小。