我用我的代码发布了一个问题,其中唯一的#include指令如下:
#include <bits/stdc++.h>
我的老师告诉我这样做,但在评论区我被告知我不应该这样做。
Why?
我用我的代码发布了一个问题,其中唯一的#include指令如下:
#include <bits/stdc++.h>
我的老师告诉我这样做,但在评论区我被告知我不应该这样做。
Why?
当前回答
正如@Lightness Races in Orbit提到的Quora问题的答案中所解释的那样,在编程比赛的上下文中包含bits/stdc++.h并没有错。可移植性、编译时间和标准化方面的缺点与此无关。在大学编程课上,如果示例代码使用了该包含,情况也是如此。
如果您正在编写产品代码,那么就不要使用它。根据当前正在编写的代码的目的来回切换应该不是什么大问题。
其他回答
包含<bits/stdc++.h>似乎是Stack Overflow上越来越常见的东西,也许是本学年新添加到国家课程中的东西。
我想好处大概是这样给出的:
你只需要写一个#include行。 您不需要查找所有内容都在哪个标准标头中。
不幸的是,这是一个懒惰的hack,直接命名GCC内部头,而不是单个标准头,如<string>, <iostream>和<vector>。它破坏了可移植性,养成了糟糕的习惯。
缺点包括:
它可能只在那个编译器上工作。 当你使用它时,你不知道它会做什么,因为它的内容并不是由标准设置的。 即使只是将编译器升级到它自己的下一个版本也可能破坏您的程序。 每个标准标头都必须与源代码一起解析和编译,这很慢,在某些编译设置下会导致大量可执行文件。
不要这样做!
更多信息:
#include <bits/stdc++.h> with visual studio未编译 #include <bits/stdc++.h>如何在c++中工作?
Quora为什么不好的例子:
在编程比赛中使用#include <bits/stdc++.h>而不是列出很多include是一个很好的实践吗?
为什么?因为它被当作c++标准标头使用,但没有标准提到它。所以你的代码在构造上是不可移植的。在cppreference上找不到它的任何文档。所以它还不如不存在。这是某人想象出来的。
我发现——让我感到恐惧和难以置信的是——在一个著名的教程网站上,每个c++示例似乎都包含这个头文件。世界疯了。这就是证明。
对于任何撰写此类“教程”的人
请停止使用此标头。算了吧。不要传播这种疯狂。如果你不愿意理解为什么这样做是错误的,请相信我的话。我不喜欢在任何事情上被当作权威人物,我可能有一半的时间都是这样,但我只在这件事上破例。我说我知道我在说什么。相信我的话。我恳求你。
附注:我可以很好地想象这种邪恶想法可能产生的可恶的“教学标准”,以及导致这种想法的环境。仅仅因为它似乎有实际的需要,并不意味着它就可以被接受——甚至在回想起来也是如此。
P.P.S. No, there was no practical need for it. There aren't that many C++ standard headers, and they are well documented. If you teach, you're doing your students a disservice by adding such "magic". Producing programmers with a magical mindset is the last thing we want. If you need to offer students a subset of C++ to make their life easier, just produce a handout with the short list of headers applicable to the course you teach, and with concise documentation for the library constructs you expect the students to use.
对我来说最大的问题是包含这个头文件将无法编译。因此,如果它在那里,我将不得不删除它,尝试编译,并添加所需的标准头文件。
如果你的老师是一个ICPC老师,那么他/她是对的,但如果你的老师是一个软件工程老师,他/她可能不是。 两者各有利弊:
使用它可以节省编码时间,但会增加编译时间。 由于它包含大量名称空间,您可能会意外地遇到难以调试的问题。
正如@Lightness Races in Orbit提到的Quora问题的答案中所解释的那样,在编程比赛的上下文中包含bits/stdc++.h并没有错。可移植性、编译时间和标准化方面的缺点与此无关。在大学编程课上,如果示例代码使用了该包含,情况也是如此。
如果您正在编写产品代码,那么就不要使用它。根据当前正在编写的代码的目的来回切换应该不是什么大问题。