我在 Visual Studio 2010 中启动项目时会自动生成一个名为 stdafx.h
的文件。我需要制作一个跨平台的 C++ 库,所以我不/不能使用这个头文件。
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 文件(几乎是唯一的之前允许的是评论)。
在这些条件下,编译器不会从头开始,而是从已保存的编译 stdafx.h
中的所有内容的结果开始编译。
我不相信这个技巧是微软编译器独有的,我也不认为这是一个原创的开发。
对于 Microsoft 编译器,控制预编译头文件使用的设置由编译器的命令行参数控制:/Yu "stdafx.h"
。可以想象,使用 stdafx.h
文件名只是一种约定;如果您愿意,可以更改名称。
在 Visual Studio 2010 中,此设置由 GUI 控制,方法是右键单击 CPP 项目,选择“属性”并导航到“配置属性\C/C++\预编译头文件”。对于其他版本的 Visual Studio,GUI 中的位置会有所不同。
请注意,如果您禁用预编译头文件(或通过不支持它们的工具运行您的项目),它不会使您的程序非法;它只是意味着您的工具每次都会从头开始编译所有内容。
如果您正在创建一个没有 Windows 依赖项的库,您可以轻松地从 stdafx.h
文件中注释掉或删除 #include
。不需要删除文件本身,但显然您也可以这样做,方法是禁用上面的预编译头设置。
这是一个“预编译的头文件”——您在 stdafx.h 中包含的任何头文件都经过预处理,以在后续编译期间节省时间。您可以阅读有关它的更多信息here on MSDN。
如果您正在构建跨平台应用程序,请在创建项目时选中“空项目”,Visual Studio 根本不会在您的项目中放置任何文件。
“Stdafx.h”是一个预编译的头文件。它包含标准系统包含文件和项目特定包含文件,这些文件经常使用但不经常更改。这减少了编译时间和不必要的处理。
Precompiled Header stdafx.h 基本上用在 Microsoft Visual Studio 中,让编译器知道已经编译过的文件,而无需从头开始编译。你可以阅读更多关于它
http://www.cplusplus.com/articles/1TUq5Di1/
https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017
定义:“Stdafx.h”是一个预编译的头文件。
预编译意味着一次编译不需要再次编译。
stdafx.h 基本上用在 Microsoft Visual Studio 中,让编译器知道文件已经编译一次,无需从头开始编译。
例如:如果您包含以下 Windows 头文件。
代码:
#include <windows.h>
#include <string.h>
int main()
{
//your code
return 0;
}
编译器总是从头开始编译这些头文件。
但是,如果你在这些头文件之前包含#include "stdafx.h",那么编译器将从stdafx.h 中找到已编译的头文件,并且不会从头开始编译它。
编译器第一次从头开始正常编译。
代码:
#include "stdafx.h"
#include <windows.h>
#include <string.h>
int main()
{
//your code
return 0;
}
优点:
减少编译时间。
减少不必要的处理。
来源:http://www.cplusplus.com/articles/1TUq5Di1/
我自己只是遇到了这个问题,因为我试图为自己创建一个简单的框架,但首先是在 Visual Studio 2017 中创建一个新的 Win32 程序选项。“stdafx.h”是不必要的,应该删除。然后,您可以删除解决方案资源管理器中的愚蠢“stdafx.h”和“stdafx.cpp”以及项目中的文件。在它的地方,你需要把
#include <Windows.h>
反而。
#include "stdafx.h"
吗?当然,但这只是一个标准的#include。 “MS 扩展”部分只是编译器性能优化;它不会改变恰好称为“stdafx.h”的头文件的语义。请注意,如果您删除包含并且您的代码依赖于通过 stdafx.h 包含的任何内容,您将不得不直接包含它。#include
它们的位置(由评估宏的同一“预处理器”步骤完成)。然后将生成的总文件传递给实际的编译器,它永远不会将头文件视为单独的实体。您只将声明放在头文件上,因为这在头文件上效果很好 - 这是一个常规规则。试试看!创建一个包含整个程序的头文件,然后创建一个只有#include 的源文件。它编译得很好。