Visual Studio中“stdafx.h”的用法是什么?

当我在VS2010中启动一个项目时,stdafx.h自动生成。 我需要做跨平台的C ++库,所以我不/不能使用这个头文件。

这个是来做什么的? 我可以删除这个头文件吗?

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

编译包含在C ++文件之上的头文件是一个非常漫长的过程。 编译构成Windows API和其他大型API库的巨大头结构是一个非常 非常漫长的过程。 对于每一个Cpp源文件都必须重复执行,结果是死亡。

这不是Windows所独有的,而是所有编译器都需要针对像Windows这样的大型API进行编译的老问题。

Microsoft编译器可以通过一个称为预编译头的简单技巧来改善这个问题。 这个技巧非常漂亮:尽管每个CPP文件都可能会在合法上赋予每个Cpp文件顶部包含的头文件链的细微差别(例如,在包含之前有不同的宏定义)通过以不同的顺序包含标题),那通常不是这种情况。 大多数情况下,我们有几十个或几百个包含的文件,但它们都是为了在应用程序中编译的所有Cpp文件具有相同的含义。

如果编译器不需要每次都从头开始编译每个Cpp文件加几十个包含字符,那么编译器可以节省大量时间。

诀窍在于指定一个特殊的头文件作为所有编译链的起点,即所谓的“预编译头文件”,这个文件通常是一个名为stdafx.h的文件,仅仅是出于历史的原因。

只需在您的stdafx.h文件中以适当的顺序列出所有您的API的大型头文件,然后在任何有意义的内容之前,使用#include "stdafx.h"在最上面启动每个CPP文件关于唯一允许的事情是评论)。

在这些条件下,编译器不是从头开始编译,而是编译stdafx.h已经保存的所有结果开始编译。

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

对于Microsoft编译器,控制预编译头文件使用的设置由编译器的命令行参数控制: /Yu "stdafx.h" 。 正如你可以想象的那样,使用stdafx.h文件名只是一个惯例; 如果您愿意,可以更改名称。

在Visual Studio 2010中,通过右键单击CPP项目,选择“属性”并导航到“Configuration Properties \ C / C ++ \ Precompiled Headers”,从GUI控制此设置。 对于其他版本的Visual Studio,GUI中的位置将有所不同。

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

如果你正在创建一个没有Windows依赖关系的库,你可以很容易的注释掉或从stdafx.h文件中删除#includes。 没有必要删除文件本身,但显然你也可以这样做,通过禁用上面的预编译头设置。

这是一个“预编译头文件” – 任何包含在stdafx.h中的头文件都会被预处理,以节省后续编译时间。 你可以在MSDN上阅读更多关于它的信息 。

如果您正在构建跨平台的应用程序,请在创建项目时选中“空项目”,Visual Studio将不会在项目中放置任何文件。

不,不是的。 只需在创建项目时取消选择包含预编译头的选项。

“我不相信这个技巧是微软编译器独有的,我也不认为这是一个原创的开发。”这是正确的。

我在1991/92年左右第一次遇到了使用borland c ++编译器的预编译头文件,我不相信它也是从那里开始的。

另一个发展是增量链接,通过将引用的代码链接到可执行文件来帮助减少代码大小。

避免重新编译没有被重写或更新的代码的其他方法是将你的项目拆分成许多单独的文件,在这些文件中,只有被更改的文件在链接之前被重新编译,在那些大的缓慢的gui实际上做之前, 。

我刚刚遇到了这个问题,因为我试图创建一个准系统框架,但是在Visual Studio 2017中创建了一个新的Win32程序选项。“Stdafx.h”是不需要的,应该删除。 然后,您可以删除解决方案资源管理器中的愚蠢“Stdafx.h”和“stdafx.cpp”以及项目中的文件。 在这个地方,你需要放

 #include <Windows.h> 

代替。