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


500

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

有什么stdafx.h用?我可以删除此头文件吗?


2
如果我得到有关stdafx.h中编译错误,我一般设置为不创建或使用本文件中的设置..
phoad

6
文章:适用于新手的StdAfx.h-viva64.com/zh/b/0265 – user965097 2014

您可以在其他平台上使用头文件,因为它们只是普通的头文件。它在那里没有提供任何性能优势。
安德里亚(Andrea)

Answers:


826

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

编译包含在C ++文件顶部的标头是一个非常漫长且缓慢的过程。编译构成Windows API和其他大型API库的一部分的巨大头结构是一个非常非常漫长且缓慢的过程。不得不为每个Cpp源文件一遍又一遍地重复执行操作,这是一个丧钟。

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

Microsoft编译器可以通过一种称为预编译头的简单技巧来解决此问题。诀窍非常巧妙:尽管每个CPP文件都可以潜在地和合法地为每个Cpp文件顶部包含的头文件链赋予不同的含义(例如在包含之前预先定义不同的宏,或者(以不同的顺序包含标题),通常情况并非如此。在大多数情况下,我们有数十个或数百个包含的文件,但是对于在您的应用程序中编译的所有Cpp文件,它们都具有相同的含义。

如果编译器不必每次都从头开始逐字地编译每个Cpp文件及其数十个包含文件,则可以节省大量时间。

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

只需以适当的顺序在stdafx.h文件中列出您的API的所有巨大头文件,然后#include "stdafx.h"在任何有意义的内容之前,在最顶层的每个CPP文件都以开头,(之前唯一允许的是注释)。

在这种情况下,编译器无需从头开始,而是从已经保存的编译所有内容的结果开始编译stdafx.h

我不认为此技巧是Microsoft编译器独有的,也不认为它是原始开发。

对于Microsoft编译器,控制预编译头的使用的设置由编译器的命令行参数控制:/Yu "stdafx.h"。可以想象,stdafx.h文件名的使用只是一个约定。您可以根据需要更改名称。

在Visual Studio 2010中,通过在CPP项目上单击鼠标右键,选择“属性”并导航到“配置属性\ C / C ++ \预编译头”,可以从GUI控制此设置。对于其他版本的Visual Studio,GUI中的位置将有所不同。

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

如果要创建没有Windows依赖项的库,则可以轻松注释掉文件或#includestdafx.h文件中删除。不需要删除文件本身,但是显然,您也可以通过禁用上面的预编译头设置来删除文件。


6
即使您只使用了std名称空间中的文件,也可以获得速度上的好处
Ghita 2012年

11
omg,确实是一个很好的答案。我正在寻找符合标准的c编译器。事实证明,我可以从项目属性中禁用micro $ oft扩展,将编译器从“ auto”更改为“ c”,并且您几乎拥有“标准”编译器和IDE。
EKanadily

4
@Rishi:按“线”,您是#include "stdafx.h"什么意思?当然,但这只是一个标准的#include。“ MS扩展”部分只是编译器性能的优化;它不会更改具有恰好被称为“ stdafx.h”的头文件的语义。请注意,如果删除了include,并且您的代码依赖于stdafx.h包含的任何内容,则必须直接包含它。
Euro Micelli 2014年

4
@ Youda008,不是很正确。在编译代码文件之前,标头的内容会#include在源文件中的位置被简单地按字面意义“粘贴” (由评估宏的同一“预处理器”步骤完成)。然后将生成的总文件传递给实际的编译器,该编译器从不会将头文件视为单独的实体。您只需要在头文件上放置声明,因为这在头文件上很有效-这是一个常规规则。尝试一下!使用整个程序创建头文件,然后创建仅具有#include的源文件。它编译良好。
Euro Micelli 2014年

28
历史的好奇心。stdafx.h的名称可以追溯到1992年左右,当时MFC在其发布之前被称为“应用程序框架扩展”。Visual Studio 2015仍默认使用名称..
kert

48

这是一个“预编译的头文件”-对stdafx.h中包含的所有头进行预处理,以节省后续编译时的时间。您可以在MSDN上阅读有关内容的更多信息。

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


15
该文件中没有任何内容无法在其他平台上运行。如果编译器不支持预编译的头文件,则可能会减慢那里的编译速度,但不应破坏它。它只是一个包含其他头文件的头文件。
2011年

2
@detunized:也许我的回答听起来不一样,所以感谢您澄清这一部分。
卡萨布兰卡

3

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

预编译头stdafx.h基本上在Microsoft Visual Studio中用于使编译器知道曾经编译过的文件,而无需从头开始进行编译。您可以阅读更多有关它的内容

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

https://docs.microsoft.com/zh-cn/cpp/ide/precompiled-header-files?view=vs-2017


-10

我只是自己遇到这个问题,因为我试图为自己创建一个裸露的框架,但首先在Visual Studio 2017中创建了一个新的Win32 Program选项。“ stdafx.h”是不必要的,应将其删除。然后,您可以删除解决方案资源管理器中的愚蠢的“ stdafx.h”和“ stdafx.cpp”以及项目中的文件。在这里,您需要将

#include <Windows.h>

代替。

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.