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


13

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

#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


6
如果您还记得这std::stoi是用于处理字符串的,则可以猜想这<string>将是一个不错的标头。或者,您可以搜索一个很好的参考资料来告诉您。并且我建议您始终明确包含头文件,因此您不必依赖于非便携式实现特定的行为。
一些程序员花花公子

3
最好的方法是在转到任何其他平台之前先进入cppreference。他们那里有相当详细的资料。
Siddharth

1
编写代码时,请包括适当的标头。就是 当您编写包含的代码时std::stoi,您立即确保它#include <string>也存在。
桑德·戴克

3
在一般情况下,这是一个难题。但是,当我们谈论缺少的标准库包含项时,通常的方法确实是检查所有使用的函数调用/类型。
Max Langhof

1
@ skratchi.at,告诉学生可以使用所需的任何编译器,只要其代码符合标准即可。4年后,这是第一次成为一个问题。
ChrisMM

Answers:


14

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

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

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

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

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

不要试图以廉价,不可移植的黑客之类的方式将其全部解雇<bits/stdc++.h>


tl; dr:说明文件


3
公平地讲,一旦您有效地记住了所有内容,而无需再查找它们,那就感觉很滑了
Lightness Races in Orbit

5
@JosephWood:如果您不知道某个给定的函数是死记硬背的,那么无论如何您都应该查找该函数以仔细检查您的假设,因此找出它属于哪个标题甚至都不需要时间。
DevSolar

1
像@JosephWood一样,我也希望那些有更多经验的人有更好的方法。我知道大多数STL函数都包含哪些标头,但我希望有一种比查找每个函数更简单的方法来教学生:P
ChrisMM

1
@ChrisMM有诸如include-what-you-use之类的工具。它们的正确性不能得到保证(确实有时需要手动操作),但这一点也不差。
怪胎

4
@ChrisMM教您的学生参考文档非常重要,非常重要。每天都有成千上万的人涌入这个网站,却没有尘世间的想法。使用文档更容易/更好的方法。
Lightness Races in Orbit,

-1

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

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

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

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


如果工作正常,当已经包含其他标题时,clion不会自动包含正确的标题(即,如果已经包含iostream,则不会在此处建议字符串)IIRC
RiaD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.