我为什么不#include ?

问题描述 投票:169回答:3

我在我的代码中发布了一个问题,其唯一的#include指令如下:

#include <bits/stdc++.h>

我的老师告诉我这样做,但在评论部分,我被告知我不应该这样做。

为什么?

c++ c++11 c++14 c++03 turbo-c++
3个回答
219
投票

包括<bits/stdc++.h>似乎在Stack Overflow上看起来越来越普遍,也许是本学年新增加到国家课程中的东西。

我想这些含义很模糊:

  • 你只需要写一个#include线
  • 您无需查找所有标准标头

不幸的是,这是一个懒惰的黑客,直接命名一个GCC内部头,而不是像<string><iostream><vector>这样的单个标准头。它破坏了便携性并养成了可怕的习惯。

缺点包括:

  • 它可能只适用于该编译器
  • 您不知道使用它时它会做什么,因为它的内容不是由标准设置的
  • 即使只是将编译器升级到自己的下一个版本也可能会破坏您的程序
  • 每个标准头必须与源代码一起进行解析和编译,这很慢并且在某些编译设置下会导致庞大的可执行文件

不要这样做!


更多信息:

Quora为什么不好的例子:


23
投票

为什么?因为它被用作好像它应该是一个C ++标准头,但没有标准提到它。所以你的代码是不可移植的。你在cppreference上找不到任何关于它的文档。所以它可能不存在。这是某人想象力的虚构:)


5
投票

有一个名为Programming Puzzles & Code Golf的Stack Exchange站点。该网站上的编程难题符合puzzle的定义:“玩具,问题或其他设计旨在通过提供难以通过聪明才智或耐心努力解决的娱乐来娱乐。”它们旨在娱乐,而不是让工作程序员在日常工作中遇到的现实问题感到愉快。

Code Golf是“一种休闲计算机编程竞赛,参与者努力实现实现某种算法的最短源代码。”在PP&CG网站的答案中,您会看到人们指定答案中的字节数。当他们找到一种方法来削减几个字节时,他们将删除原始数字并记录新数字。

正如您所料,代码打高尔夫奖励极端编程语言滥用。单字母变量名称。没有空格。创造性地使用库函数。未记载的功能。非标准编程实践。令人震惊的黑客。

如果程序员在工作中提交了包含高尔夫风格代码的拉取请求,则会被拒绝。他们的同事会嘲笑他们。他们的经理会在桌边聊天。即便如此,程序员通过提交PP和CG的答案来娱乐自己。

这与stdc ++有什么关系.h?正如其他人所指出的,使用它是懒惰的。它是不可移植的,因此您不知道它是否适用于您的编译器或下一版本的编译器。它会助长坏习惯。这是非标准的,因此您的程序行为可能与您的预期不同。它可能会增加编译时间和可执行文件大小

这些都是有效和正确的反对意见。那么为什么有人会使用这种怪物呢?

事实证明,有些人喜欢编程拼图而没有代码高尔夫。他们聚在一起参加ACM-ICPC,Google Code Jam和Facebook Hacker Cup等活动,或者在Topcoder和Codeforces等网站上竞争。他们的排名基于程序的正确性,执行速度以及他们提交解决方案的速度。为了最大化执行速度,许多参与者使用C ++。为了最大化编码速度,其中一些使用stdc ++。

这是个好主意吗?让我们检查一下缺点。可移植性?无关紧要,因为这些编码事件使用竞争者事先知道的特定编译器版本。符合标准?与使用寿命不到一小时的代码块无关。编译时间和可执行文件大小?这些不是比赛评分标题的一部分。

所以我们留下了坏习惯。这是有效的反对意见。通过使用此头文件,参赛者可以避免了解哪个标准头文件定义了他们在程序中使用的功能。当他们编写真实世界的代码(而不是使用stdc ++。h)时,他们将不得不花时间查找这些信息,这意味着他们的工作效率会降低。这是用stdc ++练习的缺点。

这提出了一个问题,即为什么它值得参与竞争性编程,如果它鼓励使用stdc ++等坏习惯并且违反其他编码标准。一个答案是人们这样做的原因与他们在PP&CG上发布节目的原因相同:一些程序员发现在类似游戏的环境中使用他们的编码技巧是很有趣的。

因此,是否使用stdc ++。h的问题归结为编程竞赛中编码速度的好处是否超过了使用它可能产生的坏习惯。

这个问题问:“我为什么不#include <bits/stdc++.h>?”我意识到有人提出要求并给予回答,并且接受的答案是对这个问题的真正答案。但问题不是“我为什么不在生产代码中#include <bits/stdc++.h>?”因此,我认为考虑答案可能不同的其他情况是合理的。

© www.soinside.com 2019 - 2024. All rights reserved.