小编典典

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

all

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

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


阅读 126

收藏
2022-03-10

共1个答案

小编典典

所有 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 文件(之前几乎唯一允许的是注释)。

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

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

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

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

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

如果您正在创建一个没有 Windows 依赖项的库,您可以轻松地从文件中注释掉或删除#includes
stdafx.h不需要删除文件本身,但显然您也可以这样做,方法是禁用上面的预编译头设置。

2022-03-10