我在 Visual Studio 2010 中启动项目时会自动生成一个名为的文件stdafx.h。我需要制作一个跨平台的 C++ 库,所以我不/不能使用这个头文件。
stdafx.h
是stdafx.h用来做什么的?我可以删除这个头文件吗?
所有 C 编译器都有一个严重的性能问题需要处理。编译 C 代码是一个漫长而缓慢的过程。
编译包含在 C++ 文件之上的头文件是一个 非常 漫长、缓慢的过程。编译构成 Windows API 和其他大型 API 库一部分的巨大标头结构是一个 非常 、 非常 漫长、缓慢的过程。必须为每个 Cpp 源文件一遍又一遍地做这件事是敲响了丧钟。
这不是 Windows 独有的,而是所有必须针对 Windows 等大型 API 进行编译的编译器都面临的老问题。
Microsoft 编译器可以通过一个称为预编译头 的简单技巧来改善这个问题。诀窍非常巧妙:尽管每个 CPP 文件都可能合法地为每个 Cpp 文件顶部包含的头文件链赋予稍微不同的含义(通过在包含之前使用不同的宏#define’d 之类的东西,或者通过以不同的顺序包含标题),通常情况并非如此。大多数时候,我们有几十个或几百个包含文件,但它们都旨在对您的应用程序中正在编译的所有 Cpp 文件具有相同的含义。
如果编译器不必每次都从头开始编译每个 Cpp 文件及其数十个包含文件,那么它可以节省大量时间。
诀窍包括指定一个特殊的头文件作为所有编译链的起点,即所谓的“预编译头”文件,由于历史原因,它通常是一个名为 stdafx.h的文件。
只需按适当的顺序在 stdafx.h 文件中列出 API 的所有大标题,然后#include "stdafx.h"在任何有意义的内容之前以 , 开头每个 CPP 文件(之前几乎唯一允许的是注释)。
#include "stdafx.h"
在这些条件下,编译器不是 从头开始 ,而是从已经保存的编译结果开始编译stdafx.h.
我不相信这个技巧是微软编译器独有的,我也不认为这是一个原创的开发。
对于 Microsoft 编译器,控制预编译头文件使用的设置由编译器的命令行参数控制:/Yu "stdafx.h". 可以想象,stdafx.h文件名的使用只是一种约定;如果您愿意,可以更改名称。
/Yu "stdafx.h"
在 Visual Studio 2010 中,此设置由 GUI 控制,方法是右键单击 CPP 项目,选择“属性”并导航到“配置属性\C/C++\预编译头文件”。对于其他版本的 Visual Studio,GUI 中的位置会有所不同。
请注意,如果您禁用预编译头文件(或通过不支持它们的工具运行您的项目),它不会使您的程序非法;它只是意味着您的工具每次都会从头开始编译所有内容。
如果您正在创建一个没有 Windows 依赖项的库,您可以轻松地从文件中注释掉或删除#includes 。stdafx.h不需要删除文件本身,但显然您也可以这样做,方法是禁用上面的预编译头设置。
#include