stdafx.h
在Visual Studio 2010中启动项目时,会自动生成一个名为的文件。我需要制作一个跨平台的C ++库,因此我不/不能使用此头文件。
有什么stdafx.h
用?我可以删除此头文件吗?
stdafx.h
在Visual Studio 2010中启动项目时,会自动生成一个名为的文件。我需要制作一个跨平台的C ++库,因此我不/不能使用此头文件。
有什么stdafx.h
用?我可以删除此头文件吗?
Answers:
所有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依赖项的库,则可以轻松注释掉文件或#include
从stdafx.h
文件中删除。不需要删除文件本身,但是显然,您也可以通过禁用上面的预编译头设置来删除文件。
#include "stdafx.h"
什么意思?当然,但这只是一个标准的#include。“ MS扩展”部分只是编译器性能的优化;它不会更改具有恰好被称为“ stdafx.h”的头文件的语义。请注意,如果删除了include,并且您的代码依赖于stdafx.h包含的任何内容,则必须直接包含它。
#include
在源文件中的位置被简单地按字面意义“粘贴” (由评估宏的同一“预处理器”步骤完成)。然后将生成的总文件传递给实际的编译器,该编译器从不会将头文件视为单独的实体。您只需要在头文件上放置声明,因为这在头文件上很有效-这是一个常规规则。尝试一下!使用整个程序创建头文件,然后创建仅具有#include的源文件。它编译良好。
“ 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