Visual Studio中的"stdafx.h"是用来做什么的?

当我在Visual Studio 2010中启动一个项目时,会自动生成一个名为stdafx.h的文件。我需要制作一个跨平台的C++库,所以我没有/不能使用这个头文件。

stdafx.h是用来做什么的?我直接删除这个头文件可以吗?

解决办法

所有的C++编译器都有一个严重的性能问题需要处理。编译C++代码是一个漫长而缓慢的过程。

编译包含在C++文件之上的头文件是一个漫长而缓慢的过程。编译构成Windows API和其他大型API库一部分的巨大头文件结构是一个、***的漫长而缓慢的过程。对于每一个Cpp源文件来说,不得不一遍又一遍地进行编译,这简直是一个死亡的信号。

这不是Windows独有的问题,而是所有必须针对Windows这样的大型API进行编译的编译器所面临的一个老问题。

微软的编译器可以通过一个简单的技巧来改善这个问题,这个技巧叫做预编译头文件。这个技巧非常巧妙:尽管每个CPP文件都可以潜在地、合法地对包含在每个Cpp文件之上的头文件链赋予轻微的不同含义(通过在包含之前设置不同的宏#define'd,或者以不同的顺序包含头文件),但情况往往并非如此。大多数情况下,我们有几十个或几百个包含文件,但它们对于你的应用程序中正在编译的所有Cpp文件都有相同的意义。

如果编译器不必每次都从头开始编译每个Cpp文件和几十个包含文件,就可以节省大量时间。

这个技巧包括指定一个特殊的头文件作为所有编译链的起点,也就是所谓的预编译头文件,通常是一个名为stdafx.h的文件,这只是出于历史原因。

简单地在stdafx.h文件中按适当的顺序列出所有用于API的巨大头文件,然后在每个CPP文件的最上面用#include "stdafx.h"开始,在任何有意义的内容之前(前面唯一允许的就是注释)。

在这种情况下,编译器不是从头开始*,而是从已经保存的对stdafx.h中的所有内容进行编译的结果开始编译。

我不相信这个技巧是微软编译器所独有的,我也不认为这是一个原创性的发展。

对于微软的编译器,控制使用预编译头文件的设置是由编译器的命令行参数控制的。/Yu "stdafx.h"。你可以想象,使用stdafx.h文件名只是一个惯例;如果你愿意,可以改变这个名字。

在Visual Studio 2010中,这个设置是通过在CPP项目上点击右键,选择'属性',然后导航到"配置属性/C++/预编译头文件"从GUI中控制。对于其他版本的Visual Studio,GUI中的位置会有所不同。

请注意,如果你禁用预编译头文件(或通过不支持预编译头文件的工具运行你的项目),并不会使你的程序变得非法;它只是意味着你的工具每次都会从头编译。

如果你正在创建一个没有Windows依赖性的库,你可以轻松地注释或删除stdafx.h文件中的#includes。没有必要删除该文件本身,但显然你也可以这样做,通过禁用上述预编译头的设置。

评论(16)

它是一个"预编译头文件"--你在stdafx.h中包含的任何头文件都会被预处理,以节省后续编译的时间。你可以阅读更多关于它的信息[在MSDN上](http://msdn.microsoft.com/en-us/library/h552b3ca.aspx)。

如果你正在构建一个跨平台的应用程序,在创建你的项目时勾选"空项目",Visual Studio就不会在你的项目中放入任何文件。

评论(2)

我自己刚刚遇到这个问题,因为我正试图为自己创建一个赤裸裸的框架,但一开始就在Visual Studio 2017中创建了一个新的Win32程序选项。"stdafx.h"是不必要的,应该被删除。 然后你可以删除解决方案资源管理器中愚蠢的"stdafx.h"和"stdafx.cpp",以及你项目中的文件。 在它的位置上,你需要把

#include 

来代替。

评论(0)