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

克里斯·MM

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

#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:说明文件

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章