为什么我不应该 #include < bits/stdc++.h>?

Why should I not #include <bits/stdc++.h>?

提问人:Lightness Races in Orbit 提问时间:8/5/2015 最后编辑:L. F.Lightness Races in Orbit 更新时间:7/6/2023 访问量:87103

问:

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

#include <bits/stdc++.h>

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

为什么?

C 可移植性 turbo-c++ c++- faq 实现定义行为

评论

156赞 user4581301 8/5/2015
哼。我应该知道在某个地方会有一个包含版本。using namespace std;
7赞 Chris Beck 2/1/2016
为什么这个标题甚至存在?当然,没有一个标准包含实际上包括这个,因为它会带来很多垃圾?如果它没有被任何公众包括在内,包括......那为什么在发行版中发货呢?
20赞 Lightness Races in Orbit 2/1/2016
@ChrisBeck:这是一个实现细节。它不是“公共 API”的一部分,也不是供使用的。但它仍然必须发货,否则什么都行不通。标准包含可能不会单独使用它,但它可以在预编译标头中使用。请参阅顶部的注释,其中说:“这是预编译标头的实现文件。
5赞 Jonathan Wakely 8/8/2019
@LightnessRacesinOrbit “它不是'公共 API' 的一部分,也不是用来使用的。完全错误,它旨在作为预编译标头供公众使用。Libstdc++(预)编译并安装该头文件的预编译版本,因此,如果您包含它,那么 G++ 实际上将包含预编译版本。它之所以存在,是因为它必须存在,以便可以生成它的预编译版本。bits/stdc++.h.gch
8赞 Lightness Races in Orbit 8/8/2019
@JonathanWakely 我是说标准库的公共 API;不是 libstdc++。每天在 Stack Overflow 上使用它的人(以及他们的项目)并没有因为您所说的原因或用例而使用它。当然,我的评论本来可以更准确地措辞,但请注意,我确实指出了它对预编译标头的用途。随意写一个竞争性的答案。

答:

509赞 Lightness Races in Orbit 8/5/2015 #1

在 Stack Overflow 上,包含似乎越来越常见,也许是本学年国家课程中新添加的内容。<bits/stdc++.h>

我想这些优点是模糊的:

  • 你只需要写一行。#include
  • 您无需查找所有内容都在哪个标准标头中。

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

缺点包括:

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

别这样!


更多信息:

Quora不好的例子:

评论

124赞 Kuba hasn't forgotten Monica 9/5/2015
“也许是本学年国家课程中新增加的东西” 盲人领导盲人:(
70赞 StoryTeller - Unslander Monica 6/27/2017
刚从虫洞来到这里又问了一句,很不错。让这种教学习惯变得更糟的是,它通常紧随其后的是直接的.只需两行,几乎使用了每个漂亮的标识符。看到它被教授,真是令人难以置信。using namesapce std;
18赞 YSC 2/6/2018
关于quora的例子,它可能随着时间的推移而变化。我今天访问了该页面以及 <bits/stdc++.h> 的优缺点,其中列出了在线编程竞赛的特定上下文。我觉得他们的结论还不错。
10赞 IInspectable 8/25/2018
@EvgeniSergeev:2KiB是大量的代码、数据、符号信息等,在试图确定其效果时。你了解正在添加的所有内容吗?对于您的编译器?当前版本?介于两者之间的所有版本?所有未来版本?如果您需要在便利性和正确性之间做出决定,只有一个有效的选项。
6赞 underscore_d 11/20/2018
希望不是课程,而只是一个在“竞赛”网站上传播的货物崇拜或其他东西......虽然可悲的是,无论哪种方式,都不会让我感到惊讶。
118赞 Kuba hasn't forgotten Monica 8/7/2015 #2

为什么?因为它被当作 C++ 标准头文件使用,但没有标准提到它。因此,您的代码在构造上是不可移植的。你不会在 cppreference 上找到它的任何文档。所以它可能不存在。这是某人想象的虚构:)

我发现 - 令我震惊和难以置信 - 有一个著名的教程站点,每个 C++ 示例似乎都包含此标头。世界疯了。这就是证明。


致任何编写此类“教程”的人

请停止使用此标头。忘掉它。不要传播这种精神错乱。如果你不愿意理解为什么这样做是错误的,请相信我的话。我完全不能被当作权威人物对待,而且我可能有一半的时间都充满了它,但我只会在这一种情况下破例。我声称我知道我在这里说什么。相信我的话。我恳求你。

P.S. 我可以想象这个邪恶的想法可能发生的可恶的“教学标准”,以及导致它的情况。仅仅因为似乎有实际需要,并不能使它被接受——即使回想起来也是如此。

P.P.S. 不,没有实际需要。没有那么多 C++ 标准头文件,而且它们有很好的文档记录。如果你教书,你就会通过添加这样的“魔法”来伤害你的学生。培养具有神奇心态的程序员是我们最不想要的。如果您需要为学生提供 C++ 的子集以使他们的生活更轻松,只需制作一份讲义,其中包含适用于您教授的课程的简短标题列表,以及您希望学生使用的库结构的简明文档。

评论

5赞 Surt 12/20/2020
那个众所周知的网站是每个 C++ 示例看起来都像 C 程序的网站吗?
8赞 SuperNoob 3/15/2021
他说的是 GeeksForGeeks
10赞 PaulMcKenzie 4/24/2021
当包含该标头以及 .然后,简单的东西,如用户定义的 gcdswap 或变量命名数据,会表现得很奇怪,或者根本无法编译,让编码人员对问题可能是什么摸不着头脑。using namespace std;
8赞 Kuba hasn't forgotten Monica 4/26/2021
我说的是典型的“知名网站”。不幸的是,其中有很多。他们看起来总是像瞎子牵着瞎子:(
1赞 RedGreenCode 8/12/2015 #3

正如 @Lightness Races in Orbit 提到的 Quora 问题的最高答案中所解释的那样,在编程竞赛的背景下包括在内并没有错。可移植性、编译时间和标准化方面的缺点与此无关。如果示例代码使用 that,则在大学编程课程中也是如此。bits/stdc++.h

如果您正在编写生产代码,请不要使用它。根据您当前编写的代码的目的来回切换应该没什么大不了的。

评论

37赞 Lightness Races in Orbit 8/12/2015
呃,如果一个编程竞赛评判的是破碎的、非标准的代码,那么我真的不明白它的目的。“谁能最快地制作出最破损的代码”耶!干得好,我猜......
14赞 Lightness Races in Orbit 8/13/2015
使用短变量名和使用是完全不同的事情!#include <bits/stdc++.h>
30赞 Kuba hasn't forgotten Monica 9/5/2015
“如果示例代码使用的示例代码包括,那么在大学编程课上也是如此。哎呀,不。你教给的人再了解不过了。他们不知道什么是合适的,什么是不合适的:教授所写的任何东西都是凭信心接受的福音。请不要建议任何教育工作者这种愚蠢是有道理的。
16赞 Evgeni Sergeev 4/26/2016
“破”、“非标准”、“不便携”、“白痴”:所有这些都是不属于本次讨论的恐吓词。使用相关 include 的代码并不比包含第三方库的代码更不可移植。作为那些在需要时可以轻而易举地移植的东西之一,它是绝对无害的,我认为将数十万个使用它的程序称为“损坏”是一种毫无意义的煽动性姿态。这个讨论是一个很好的例子,说明当标准迂腐和可移植性狂热妨碍了便利时会发生什么。
12赞 Lightness Races in Orbit 5/1/2016
@EvgeniSergeev:安装第三方库来满足依赖关系,与必须从别人的代码中破解出来才能使其工作(因此必然在此过程中创建一个分支)之间有很大的区别。你指责我们除了使用“恐吓词”之外什么都不做,但我挑战你解释你在这里做什么,说我们是“书”和“狂热者”,除了成为这些东西之外没有目标。医生。。。。医治你自己。
85赞 RedGreenCode 4/23/2019 #4

有一个叫做Programming Puzzles & Code Golf的Stack Exchange网站。该网站上的编程谜题符合这个谜题的定义:

一种玩具、问题或其他设计,旨在通过提出需要通过独创性或耐心努力解决的困难来娱乐。

它们被设计为娱乐,而不是像一个在职的程序员可能会被日常工作中遇到的现实世界的问题逗乐一样。

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

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

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

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

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

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

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

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

这就提出了一个问题,如果竞争性编程鼓励使用和违反其他编码标准等坏习惯,为什么还值得参与。一个答案是,人们这样做的原因与他们在PP&CG上发布程序的原因相同:一些程序员发现在类似游戏的环境中使用他们的编码技能是令人愉快的。stdc++.h

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

这个问题问:“为什么我不应该 #include?我意识到它被问到和回答是为了提出一个观点,而公认的答案旨在成为这个问题的唯一真实答案。但问题不在于“为什么我不应该在生产代码中 #include?因此,我认为考虑答案可能不同的其他情况是合理的。<bits/stdc++.h><bits/stdc++.h>

评论

15赞 Martin Bonner supports Monica 4/29/2019
我已经投了赞成票,但可能值得指出的是,“为了好玩”是参加竞争性节目的一个很好的理由。另一方面,“给潜在雇主留下深刻印象”不是——它会积极损害你和我的案件。
10赞 RedGreenCode 4/29/2019
@MartinBonner我知道一些招聘经理将竞争激烈的编程经验视为一个危险信号。但只要顶级软件公司在面试中使用CP式的问题,并举办编程竞赛来寻找新人,CP将继续受到有抱负的开发人员的欢迎。
11赞 RedGreenCode 7/24/2019
@JesperJuhl 如果贵公司的技术面试官在面试中使用算法谜题(就像许多人一样),那么具有竞争性编程经验的候选人就会有优势。也许候选人的理性选择是参加CP,但避免在简历/简历中提及。
8赞 Kuba hasn't forgotten Monica 4/6/2020
虽然这个标头确实可以在一些竞争性编程中找到用处,但它并不是它的来源。它来自一间教室。无论谁在那间教室里教书,都有足够的影响力来污染——通过随后的级联——数万甚至数十万学生(通过教育当时在不知不觉中传播这种疾病的老师和同龄人)。现在,这些学生也在编写教程。我只想在角落里哭泣。竞争性编程网站应该只有一个正则表达式来拒绝任何非标准标头
7赞 Elliott 6/16/2021
@MartinBonnersupportsMonica 在简历中提到 CP 结果是负面的——展示相关的解决问题的能力和积极的热情——的想法简直是疯狂的。编码风格和对架构的良好利用、团队合作等都是必不可少的,但申请人不必在简历的每个点上勾选所有这些框。
27赞 Bulletmagnet 11/3/2019 #5

从 N4606,工作草案,编程语言 C++ 标准:

17.6.1.2 标头 [headers]

  1. C++ 标准库的每个元素都在标头中声明或定义(根据需要)。

  2. C++ 标准库提供了 61 个 C++ 库头文件,如表 14 所示。

表 14 — C++ 库头文件

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

那里没有 <bits/stdc++.h>。这并不奇怪,因为<位/...>标头是实现细节,通常带有警告:

  • 这是一个内部头文件,由其他库头文件包含。
  • 不要尝试直接使用它。

<bits/stdc++.h> 还带有警告:

  • 这是预编译标头的实现文件。
7赞 Yunfei Chen 7/8/2020 #6

我们不使用的原因:

#include <bits/stdc++.h>

是因为效率。 让我打个比方: 对于那些了解 Java 的人: 如果你问你的教练以下是否是一个好主意,除非他们是一个糟糕的教练,否则他们会说不:

import java.*.*

#include...事情基本上做同样的事情......这不是不使用它的唯一原因,但它是不使用它的主要原因之一。 对于现实生活中的类比: 想象一下,你有一个图书馆,你想从图书馆借几本书,你会把整个图书馆搬到你家旁边吗?这将是昂贵和低效的。如果你只需要 5 本书,那么只需要拿出 5 本书......不是整个图书馆.....

#include <bits/stdc++.h>

看起来很方便,我只需要输入一个包含语句就可以了,它与移动整个图书馆是一样的,看我只需要移动一个完整的图书馆,而不是 5 本书,一本一本。对你来说看起来很方便,也就是说,对于真正必须搬家的人来说??没有那么多,猜猜在 C++ 中移动的人会是你的电脑......计算机不会喜欢为您编写的每个源文件移动整个库:).....

评论

2赞 Toby Speight 2/13/2022
这几乎可以肯定是为什么没有人认真提出标准的“包含所有内容”标头的根本原因。因此,有一种合理的说法可以称之为我们不使用它的“原因”。
0赞 UNREAL 7/10/2022
但是计算机速度非常快,这些东西并没有太大的影响,它会在几毫秒内完成,MISERY会浪费人类的时间。
0赞 Yunfei Chen 7/11/2022
@UNREAL你从未参与过大型项目,是吗?当您有很多文件时,它会很快加起来。
0赞 UNREAL 7/14/2022
如果我没有大型项目怎么办,我可以使用 bits/stdc++.h 吗?
1赞 ABaumstumpf 8/22/2022
这种比较是非常错误的,答案也是如此:在 Java 中是有效且定义良好的,在 C++ 中不是那样,正如该标头甚至所说的那样,以及内部标头和 GCC 的实现细节。它可以随时更改,它可能包括使您的代码格式化驱动器的宏,它可能会随着下一个版本而消失。import java.*.*#include <bits/stdc++.h>
8赞 Gabriel Staples 4/14/2022 #7

我至少喜欢通过查看此头文件来查看可以包含的所有标头的列表,以及它们属于哪个版本的 C++。在这方面,它确实很有用。

包括,到底有多糟糕?<bits/stdc++.h>

我想看到一些真实的数据 - 一些数字来比较编译时间和二进制可执行文件的大小。所以,这里有一个快速的“hello world”比较测试。

注意:要了解头文件在哪里,以及其中有什么,请直接跳到底部标题为“在哪里和是什么?”的部分。<bits/stdc++.h><bits/stdc++.h>

总结:

包括 <bits/stdc++.h> “include all headers” 标头很容易,但编译速度相对较慢。

包含头文件适用于 GCC/g++ 编译器(大概也是 LLVM Clang 编译器,因为它们的目标是与 GCC 兼容),以及<bits/stdc++.h>

  1. 对二进制可执行文件大小没有区别,但
  2. 编译时间最多可延长 4 倍!

我的测试

下面是一个示例 C++ 程序:

include_bits_stdc++.cpp

// We will test including this header vs NOT including this header
#include <bits/stdc++.h>

#include <iostream>  // For `std::cin`, `std::cout`, `std::endl`, etc.

int main()
{
    printf("Hello ");
    std::cout << "world!\n\n";

    return 0;
}

下面是一些生成和运行命令:

# make a bin directory
mkdir -p bin

# compile, timing how long it takes
time g++ -Wall -Wextra -Werror -O3 -std=c++17 include_bits_stdc++.cpp -o bin/a

# check binary executable size
size bin/a

# run
bin/a

顶部没有#include <bits/stdc++.h>

如果我按原样运行上面的“编译”命令,我会看到以下 10 个编译时间:

real    0m0.362s
real    0m0.372s
real    0m0.502s
real    0m0.383s
real    0m0.367s
real    0m0.283s
real    0m0.294s
real    0m0.281s
real    0m0.292s
real    0m0.276s

平均编译时间:= 0.3412(0.362 + 0.372 + 0.502 + 0.383 + 0.367 + 0.283 + 0.294 + 0.281 + 0.292 + 0.276)/10

size bin/a显示:

text    data     bss     dec     hex filename
2142     656     280    3078     c06 bin/a

WITH在顶部#include <bits/stdc++.h>

10 次编译:

real    0m1.398s
real    0m1.006s
real    0m0.952s
real    0m1.331s
real    0m1.549s
real    0m1.454s
real    0m1.417s
real    0m1.541s
real    0m1.546s
real    0m1.558s

平均编译时间:= 1.3752(1.398 + 1.006 + 0.952 + 1.331 + 1.549 + 1.454 + 1.417 + 1.541 + 1.546 + 1.558)/10

size bin/a显示:

text    data     bss     dec     hex filename
2142     656     280    3078     c06 bin/a

结论

因此,包含标头与 gcc/g++ 编译器配合良好,并且对二进制可执行文件大小没有影响,但编译需要 1.3752 秒 / 0.3412 秒 = 4 倍的时间!

在哪里,什么是?<bits/stdc++.h>

总结

头文件作为 gcc/g++ 编译器的一部分包含在内。<bits/stdc++.h>

如果在 Linux 上,它将位于本地系统上的 。/usr/include/x86_64-linux-gnu/c++/8/bits/stdc++.h

您可以在此处直接在线查看 gcc 源代码中的文件:gcc/libstdc++-v3/include/precompiled/stdc++.h

我至少喜欢通过查看该头文件来查看可以包含的所有标头的列表,以及它们属于哪个版本的 C++。在这方面,它确实很有用。

如果你在一个IDE中打开上面的代码,有一个很棒的索引器,比如Eclipse(它有我见过的最好的索引器;它的索引比MS VSCode好得多),并且+在行上,它将直接跳转到你系统上的头文件!在 Linux Ubuntu 上,它会直接跳转到此路径并打开此文件:.CtrlClick#include <bits/stdc++.h>/usr/include/x86_64-linux-gnu/c++/8/bits/stdc++.h

您可以直接在 gcc 源代码中查看此文件的最新版本,地址为:gcc/libstdc++-v3/include/precompiled/stdc++.h它只是一个包含所有其他头文件的头文件!这非常有用且很有见地,只需在一个地方查看所有头文件即可了解它们是什么以及它们包含什么!同样,在 Eclipse 中,您可以轻松地对每个包含的头文件进行 + 操作,以直接跳转到其源代码实现。CtrlClick

以下是 gcc 编译器中包含的完整、最新的头文件。如果您想将此内容包含在您自己的个人项目中或与其他编译器一起使用,您可以随时复制和粘贴此内容并自行创建此文件。<bits/stdc++.h>

gcc/libstdc++-v3/include/precompiled/stdc++.h

// C++ includes used for precompiling -*- C++ -*-

// Copyright (C) 2003-2022 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file stdc++.h
 *  This is an implementation file for a precompiled header.
 */

// 17.4.1.2 Headers

// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cuchar>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

#if __cplusplus >= 201402L
#include <shared_mutex>
#endif

#if __cplusplus >= 201703L
#include <any>
#include <charconv>
// #include <execution>
#include <filesystem>
#include <optional>
#include <memory_resource>
#include <string_view>
#include <variant>
#endif

#if __cplusplus >= 202002L
#include <barrier>
#include <bit>
#include <compare>
#include <concepts>
#if __cpp_impl_coroutine
# include <coroutine>
#endif
#include <latch>
#include <numbers>
#include <ranges>
#include <span>
#include <stop_token>
#include <semaphore>
#include <source_location>
#include <syncstream>
#include <version>
#endif

#if __cplusplus > 202002L
#include <expected>
#include <spanstream>
#if __has_include(<stacktrace>)
# include <stacktrace>
#endif
#include <stdatomic.h>
#endif

另请参阅

  1. https://www.geeksforgeeks.org/bitsstdc-h-c/
  2. [我的问题和答案] 了解输出中的 、 、 和 的含义:textdatabssdecsize
    1. 电气工程堆栈交换:如何在编译时知道STM32的闪存和动态存储器(SRAM)用完了多少?
    2. 将 binutils 大小输出从“sysv”格式 (size --format=sysv my_executable) 转换为 “berkeley” 格式 (size --format=berkeley my_executable

评论

2赞 Mark Ransom 10/8/2023
因为该文件是 GPL 许可的,所以在为自己的项目复制它时应该小心。它可能会使您承担法律责任,这对您和您的雇主来说可能是非常不幸的。
0赞 gnasher729 5/1/2022 #8

对我来说,最大的问题是包含此头文件不会编译。因此,如果它在那里,我将不得不删除它,尝试编译并添加所需的标准头文件。

2赞 ishandutta2007 6/11/2022 #9

如果你的老师是ICPC教练,那么他/她是对的,但如果你的老师是软件工程师,他/她可能不是。

两者都有利有弊:

优点

  • 使用它可以节省编码时间
  • 您无需为记住哪个标头包含什么而感到痛苦
  • 如果你有一个源代码限制(ICPC风格比赛通常有),并且你想挤进尽可能多的行,那么它可能会派上用场。

缺点

  • 但它会增加编译时间。
  • 由于它包含许多命名空间,因此您可能会意外遇到可能难以调试的问题。