繁体   English   中英

如何确定要包括的头文件?

[英]How to determine which header files to include?

说我有以下(非常简单)的代码。

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

这在g ++和clang上都可以编译。 但是,它无法在MSVC上编译,并出现以下错误:

错误C2039:“ stoi”:不是“ std”的成员

错误C3861:“ stoi”:找不到标识符

我知道std::stoi<string>标头的一部分,大概两个前编译器都包含在<iostream> ,而后者不是。 根据C ++标准[res.on.headers]

C ++标头可以包括其他C ++标头。

对我来说,这基本上说所有三个编译器都是正确的。

当我的一个学生提交作业时,这个问题就出现了,TA标记为未编译。 我当然去修理了。 但是,我想防止将来发生此类事件。 因此,有没有一种方法可以确定应该包括哪些头文件,而无需在每次检查的三个不同编译器上进行编译?

我能想到的唯一方法是确保对于每个std函数调用,都存在一个适当的include。 但是,如果您现有的代码长数千行,则搜索起来可能很乏味。 有没有更简单/更好的方法来确保交叉编译器的兼容性?

三种编译器的示例: https : //godbolt.org/z/kJhS6U

有没有更简单/更好的方法来确保交叉编译器的兼容性?

如果您有一个庞大的代码库并且到目前为止还没有这样做,那么这总是很麻烦的,但是一旦修复了包含内容之后,您可以坚持一个简单的过程:

当您编写使用标准功能(如std::stoi新代码时,将该名称插入Google,请转至cppreference.com文章,然后在顶部查看其定义在哪个标头中。

如果还不包括在内,则将其包括在内。 任务完成!

(您可以为此使用标准,但是访问起来不太方便。)

不要试图用廉价的,不可移植的黑客(<bits/stdc++.h>将其全部解雇!


tl; dr:说明文件

除了查看文档并手动执行(痛苦且耗时)之外,您还可以使用一些可以帮助您完成此任务的工具。

您可以在能够组织导入的Visual Studio中使用ReSharper(实际上,没有ReSharper的VS不太有用)。 如果缺少include,建议添加它,如果它已过时,则include会以较浅的颜色显示。

或者,您也可以使用具有此功能的CLion(适用于所有平台)(实际上这是同一制造商JetBrains)。

也有一个名为include的工具,您使用过 ,但是它的目的是利用前向声明的优势,我从未使用过(个人-我的队友为我们的项目所做的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM