什么是“stdafx.h"用于在Visual Studio?

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

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

506660 次浏览

它是一个“预编译头文件”——stdafx.h中包含的任何头文件都经过预处理,以节省后续编译的时间。你可以阅读更多关于它这里是MSDN

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

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

编译包含在c++文件顶部的头文件是一个非常漫长而缓慢的过程。编译构成Windows API和其他大型API库一部分的巨大头结构是一个非常非常的漫长而缓慢的过程。对于每一个Cpp源文件,必须一遍又一遍地重复,这是一个丧钟。

这不是Windows独有的问题,而是所有编译器都面临的老问题,因为它们必须编译像Windows这样的大型API。

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

如果编译器不必每次都从头开始编译每一个Cpp文件以及它的几十个include,那么它可以节省大量的时间。

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

简单地在stdafx.h文件中以适当的顺序列出api的所有大标题,然后在每个CPP文件的最顶部以#include "stdafx.h"开始,在任何有意义的内容之前(之前唯一允许的是注释)。

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

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

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

在Visual Studio 2010中,这个设置是通过右键单击CPP项目,选择“属性”并导航到“配置属性\C/ c++ \预编译头文件”来控制的。对于Visual Studio的其他版本,GUI中的位置将有所不同。

注意,如果你禁用了预编译头(或者通过不支持它们的工具运行你的项目),这并不会使你的程序非法;这仅仅意味着您的工具每次都将从头编译所有内容。

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

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

#include <Windows.h>

代替。

"Stdafx.h"是一个预编译头文件。它包含标准系统包含文件和项目特定的包含文件,这些包含文件经常使用但不经常更改。这减少了编译时间和不必要的处理。

预编译头stdafx.h在Microsoft Visual Studio中主要用于让编译器知道已经编译过的文件,而不需要从头开始编译。 你可以阅读更多关于它

http://www.cplusplus.com/articles/1TUq5Di1/

https://learn.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017

# EYZ0“Stdafx.h"是预编译头文件。

  • 预编译意味着一旦编译就不需要再次编译。
  • stdafx.h基本用于Microsoft Visual Studio,让编译器知道文件已编译
例如< p >: 如果你包含下面的windows头文件

代码:

#include <windows.h>
#include <string.h>


int main()
{
//your code
return 0;
}
  • 编译器总是从头编译这些头文件。
  • 但是如果你包含#include "stdafx.h"在这些头文件之前 编译器将从stdafx.h找到编译后的头文件,并执行 而不是从头编译
  • 编译器第一次像平常一样从头开始编译。

代码:

#include "stdafx.h"
#include <windows.h>
#include <string.h>


int main()
{
//your code
return 0;
}

优点:

  • 减少编译时间。
  • 减少不必要的处理。

来源:http://www.cplusplus.com/articles/1TUq5Di1/