说我有以下(非常简单)的代码。
#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是用于处理字符串的,则可以猜想这<string>将是一个不错的标头。或者,您可以搜索一个很好的参考资料来告诉您。并且我建议您始终明确包含头文件,因此您不必依赖于非便携式实现特定的行为。