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

最佳答案

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

编译包含在 C++ 文件顶部的头文件是一个非常漫长而缓慢的过程。编译构成 Windows API 和其他大型 API 库一部分的巨大 header 结构是一个非常, 非常 漫长而缓慢的过程。必须一遍又一遍地为每个单独的 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 中,通过右键单击 CPP 项目,选择“属性”并导航到“配置属性\C/C++\预编译头文件”,可以从 GUI 控制此设置。对于其他版本的 Visual Studio,GUI 中的位置会有所不同。

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

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

关于visual-studio - "stdafx.h"在 Visual Studio 中有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4726155/

10-12 20:49