在Visual Studio C++中,我可以使用#include "pch.h"代替#include "stdafx.h"作为我的预编译头吗?

18

这是我第一次使用C++进行编程。我正在按照learncpp.com上的C++教程学习,并且正在使用Visual Studio 2017。

在教程中,他们从一些简单的“Hello, world!”代码开始,并在代码开头放置了#include "stdafx.h"以及#include <iostream>。当我尝试复制此代码并构建它时,出现了错误:

 

C1010:寻找预编译标头时遇到意外的文件结尾。您是否忘记将#include “pch.h”添加到源中?

当我查看我的解决方案资源管理器时,我注意到在他们的教程中,在标题和源文件选项卡中有名为“stdafx.h”和“stdafx.cpp”的文件,但是对于我来说,这些文件名分别为“pch.h”和“pch.cpp”。

然后我尝试将#include "stdafx.h"重命名为#include "pch.h",然后代码就完美地构建并执行了。所以,我应该继续使用#include "pch.h"吗,还是这是某种问题?

谢谢!


2
创建一个空项目,并忽略stdafx.h。预编译头文件不是必需的。 - fractals
3
预编译头文件名称可以在“项目属性”->“C/C++”->“预编译头”选项卡中指定。它可以按翻译单元进行设置。 - user7860670
2
预编译头文件只是额外的复杂性和错误来源。除了在大型项目中加快编译时间,它们并没有什么用处。你应该关闭它们。但是回答你的问题,只要在项目设置中指定该名称,你可以使用任何你喜欢的名称。 - john
2
@john • 我的项目非常大。关闭预编译头可以加快编译速度约10%。如果不测量预编译头提供了多少加速(或减速!),很难评估其好处。我完全同意您关于额外复杂性和错误来源的看法。 - Eljay
这么多回答评论,但是这个问题还没有答案。 - Khouri Giordano
3个回答

28
几年来,预编译头文件的默认名称一直是stdafx.h。最近,在VS 2017中,项目向导创建的默认名称已更改为pch.h。我不知道为什么他们这样做了。
您可以在项目属性下的“配置属性”-> “C / C ++”->“预编译头”中调整预编译头文件的名称。您还可以在那里启用或禁用使用它们。您甚至可以对每个文件单独定义此设置。您甚至可以在一个项目中配置多个不同的预编译头文件。
所以对于您的具体问题:在教程中将stdafx.h替换为pch.h不会有任何问题。该教程可能只是旧的内容,尚未更新。

5
最佳答案在这里。考虑到提问者刚接触C++,在这个阶段陷入头文件的复杂性可能不是一个好方法。作为初学者的我也处于同样的境地,我意识到在我的教科书中学习这一章之前,最好还是使用控制台向导。 - D.C. the III
我遇到了类似的错误,阅读了这个答案之后我禁用了* pch *。我的问题是,禁用它是否无害? - Franky
3
@Franky:使用pchs可以优化代码的构建时间。这就是全部。启用或禁用它们不会以任何其他方式降低您的代码质量。 - marc40000
因为 *afx 是 MFC 的标准,所以它应该已经过时了。 - Marc.2377
如果你的代码不是非常复杂,也没有包含许多外部库,使用预编译头文件实际上会使编译时间更长。这个特性最有用的情况是当你有数千行代码和许多头文件依赖关系时,构建代码需要花费几分钟的时间。 - drescherjm

4

尝试将"#include pch.h"移到文件的最顶部(在任何其他头文件之前)。

有些编译器默认情况下不会编译预编译头文件之前的内容。不过这个设置是可以更改的。


谢谢,虽然它已经包含了,但我还是得把它们移到顶部。 - FindOutIslamNow

3
在learncpp.com的教程中,讲师建议我们在使用Visual Studio的Windows桌面向导选项创建新的C++项目时,关闭“预编译头”附加选项。在我们还没有接触到头文件的情况下这是一个好主意。
然而,pch.h似乎是“新”的stdafx.h,因此不能使用前者代替后者,至少在选择“预编译头”选项时是这样的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接