当我在Visual Studio 2010中启动项目时,会自动生成一个名为stdafx.h
的文件。我需要创建一个跨平台的C ++库,因此我不能/不能使用此头文件。< / p>
stdafx.h
用于什么?我可以删除这个头文件吗?
答案 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”是一个预编译的头文件。
例如: 如果您包含以下 Windows 头文件。
代码:
#include <windows.h>
#include <string.h>
int main()
{
//your code
return 0;
}
代码:
#include "stdafx.h"
#include <windows.h>
#include <string.h>
int main()
{
//your code
return 0;
}
优点:
答案 4 :(得分:-5)
我自己也遇到了这个问题,因为我试图创建一个简单的骨架,但最初是在Visual Studio 2017中创建一个新的Win32程序选项。&#34; stdafx.h&#34;是不必要的,应该删除。然后你可以删除愚蠢的&#34; stdafx.h&#34;和&#34; stdafx.cpp&#34;在您的解决方案资源管理器中以及项目中的文件。在它的位置,你需要把
#include <Windows.h>
代替。