我最近看到
#include <bits/stdc++.h>
包括every标准库和STL包含文件。当我尝试使用 Visual Studio 2013 编译以下代码段时,它会打印一个 error C1083: Cannot open include file: 'bits/stdc++.h': No such file or directory
。但它与 Code::blocks 配合得很好。有什么办法可以避免这个错误吗?
#include <bits/stdc++.h>
using namespace std;
int main()
{
}
我在某个帖子里看到了
...头文件不是 C++ 标准的一部分,因此不可移植,应该避免。 ...
但我认为该文件对竞赛编程很有帮助。
有什么办法可以避免这个错误吗?
是的:不要使用仅由 GCC 而不是 Microsoft 编译器提供的非标准头文件。
C++ 标准要求每个编译器提供许多标头,例如
<iostream>
和 <string>
。 但特定编译器对这些标头的实现可能依赖于该编译器也附带的其他非标准标头,<bits/stdc++.h>
就是其中之一。
将标准头文件(例如
<iostream>
)视为“公共”接口,并将特定于编译器的内容(如 bits/
中的所有内容)视为“私有”实现。 如果您希望您的程序可移植到其他编译器,甚至是 same 编译器的未来版本,则不应依赖特定于编译器的实现细节。
如果您想要一个包含所有标准标头的标头,那么编写您自己的标头很容易。
要在 Visual Studio 中使用
bits/stdc++.h
预处理器,您需要从下面给出的链接下载 stdc++.h
文件。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\
可能为空。在这种情况下,请转到 VS Code 并在顶部输入 #include <
。您将获得自动完成建议。与每个建议一起,每个建议的路径都应该可见。复制路径并将其粘贴到文件资源管理器中。该路径会将您带入上面提到的同一个 include
文件夹中。bits
的新目录,并将 stdc++.h 文件粘贴到 bits
文件夹中。这是非标准头文件,已知它是 libstdc++ 的一部分,通常与 GCC 一起提供。然而VS附带了微软自己的STL实现,它不包含这样的文件。我建议停止使用它,而是包含必要的标准标头,例如
<iostream>
、<vector>
、<string>
、<algorithm>
等。
2025 年更新:从 Visual Studio 2022 v17.12.3 和工具链 v.14.42.34433 开始,MSVC 提供与
__msvc_all_public_headers.hpp
类似的非标准头文件 bits/stdc++.h
。因此,我们现在可以编写以下可移植性较差的代码:
#if defined(_MSC_VER)
#include <__msvc_all_public_headers.hpp>
#elif defined(__GNUC__)
#include <bits/stdc++.h>
#else
#error "Unsupported compiler"
#endif
不确定 clang 是否提供类似的东西。
我的答案是 Enterprise 2015,版本 4.8.03761,更新 3。
安装 codeblocks 时,还会安装 MinGW(适用于 (W)Windows 的(最小)极简 (G)GNU 编译器集合 (GCC))。或者您可以单独安装。
我相信这个问题是因为Visual Studio在其包含目录中找不到bits/stdc++.h(项目->你的项目属性->配置属性->VC++目录->包含目录->按下拉箭头->
您需要转到该目录,并粘贴 MinGW 安装中的整个 Bits 文件夹,我的位于 (C:\MinGW\lib\gcc\mingw32\8.2.0\includ