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

时间:2011-01-18 16:00:31

标签: visual-studio visual-studio-2010 visual-c++ cross-platform stdafx.h

当我在Visual Studio 2010中启动项目时,会自动生成一个名为stdafx.h的文件。我需要创建一个跨平台的C ++库,因此我不能/不能使用此头文件。< / p>

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

5 个答案:

答案 0 :(得分:784)

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

编译包含在C ++文件之上的标题是非常长而缓慢的过程。编译构成Windows API和其他大型API库的一部分的巨大标头结构是非常非常长而缓慢的过程。对于每一个Cpp源文件来说,必须完成它,并且结束和结束都是一个致命的丧钟。

这不是Windows独有的,但是所有必须针对像Windows这样的大型API进行编译的编译器都面临着一个老问题。

Microsoft编译器可以通过一个名为预编译头的简单技巧来改善此问题。诀窍很漂亮:虽然每个CPP文件都可以在法律上给每个Cpp文件顶部包含的头文件链带来一些不同的含义(通过使用不同的宏#include在包含之前定义,或者通过以不同的顺序包括标题),这通常不是这种情况。大多数情况下,我们有几十个或几百个包含的文件,但它们都与您的应用程序中编译的所有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依赖项的库,则可以轻松地从stdafx.h文件中注释掉或删除#includes。不需要删除文件本身,但显然您也可以通过禁用上面的预编译头设置来执行此操作。

答案 1 :(得分:43)

这是一个“预编译的头文件” - 您在stdafx.h中包含的任何头文件都经过预处理,以便在后续编译期间节省时间。您可以阅读更多相关信息here on MSDN

如果您正在构建跨平台应用程序,请在创建项目时选中“清空项目”,Visual Studio将不会在项目中放置任何文件。

答案 2 :(得分:1)

“ Stdafx.h”是一个预编译的头文件。它的包含文件用于标准系统包含文件和特定项目的包含文件,这些文件经常使用但不经常更改。这减少了编译时间和不必要的处理。

预编译头文件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

答案 3 :(得分:0)

定义:“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/

答案 4 :(得分:-5)

我自己也遇到了这个问题,因为我试图创建一个简单的骨架,但最初是在Visual Studio 2017中创建一个新的Win32程序选项。&#34; stdafx.h&#34;是不必要的,应该删除。然后你可以删除愚蠢的&#34; stdafx.h&#34;和&#34; stdafx.cpp&#34;在您的解决方案资源管理器中以及项目中的文件。在它的位置,你需要把

#include <Windows.h>

代替。