当我在Visual Studio 2010中启动一个项目时,会自动生成一个名为stdafx.h的文件。我需要做一个跨平台的c++库,所以我不/不能使用这个头文件。
stdafx.h用于什么?我可以删除这个头文件吗?
当我在Visual Studio 2010中启动一个项目时,会自动生成一个名为stdafx.h的文件。我需要做一个跨平台的c++库,所以我不/不能使用这个头文件。
stdafx.h用于什么?我可以删除这个头文件吗?
它是一个“预编译头文件”——stdafx.h中包含的任何头文件都经过预处理,以节省后续编译的时间。你可以在MSDN上阅读更多信息。
如果你正在构建一个跨平台的应用程序,在创建项目时勾选“空项目”,Visual Studio将不会在你的项目中放入任何文件。
所有c++编译器都有一个严重的性能问题需要处理。编译c++代码是一个漫长而缓慢的过程。
编译包含在c++文件顶部的头文件是一个非常漫长而缓慢的过程。编译构成Windows API和其他大型API库一部分的巨大头结构是一个非常漫长而缓慢的过程。对于每一个Cpp源文件,必须一遍又一遍地重复,这是一个丧钟。
这不是Windows独有的问题,而是所有编译器都面临的老问题,因为它们必须编译像Windows这样的大型API。
The Microsoft compiler can ameliorate this problem with a simple trick called precompiled headers. The trick is pretty slick: although every CPP file can potentially and legally give a sligthly different meaning to the chain of header files included on top of each Cpp file (by things like having different macros #define'd in advance of the includes, or by including the headers in different order), that is most often not the case. Most of the time, we have dozens or hundreds of included files, but they all are intended to have the same meaning for all the Cpp files being compiled in your application.
如果编译器不必每次都从头开始编译每一个Cpp文件以及它的几十个include,那么它可以节省大量的时间。
这个技巧包括指定一个特殊的头文件作为所有编译链的起点,即所谓的“预编译头”文件,由于历史原因,它通常是一个名为stdafx.h的文件。
简单地在stdafx.h文件中列出所有api的大标题,以适当的顺序,然后在每个CPP文件的最顶部开始使用#include“stdafx.h”,在任何有意义的内容之前(之前唯一允许的是注释)。
在这些条件下,编译器不是从头开始,而是从已经保存的编译stdafx.h中所有内容的结果开始编译。
我不相信这个技巧是微软编译器独有的,我也不认为它是一个原创的开发。
对于Microsoft编译器,控制预编译头的使用的设置由编译器的命令行参数控制:/Yu "stdafx.h"。可以想象,stdafx.h文件名的使用只是一种约定;如果你愿意,你可以改名字。
在Visual Studio 2010中,这个设置是通过右键单击CPP项目,选择“属性”并导航到“配置属性\C/ c++ \预编译头文件”来控制的。对于Visual Studio的其他版本,GUI中的位置将有所不同。
注意,如果你禁用了预编译头(或者通过不支持它们的工具运行你的项目),这并不会使你的程序非法;这仅仅意味着您的工具每次都将从头编译所有内容。
如果您正在创建一个没有Windows依赖关系的库,您可以轻松地注释掉或从stdafx.h文件中删除#includes。没有必要删除文件本身,但显然您也可以这样做,通过禁用上面的预编译头设置。
我自己也遇到了这个问题,因为我试图为自己创建一个骨架框架,但从在Visual Studio 2017中创建一个新的Win32程序选项开始。"stdafx.h"是不必要的,应该删除。然后,您可以删除解决方案资源管理器中的愚蠢的“stdafx.h”和“stdafx.cpp”以及项目中的文件。在它的位置,你需要把
#include <Windows.h>
代替。
"Stdafx.h"是一个预编译头文件。它包含标准系统包含文件和项目特定的包含文件,这些包含文件经常使用但不经常更改。这减少了编译时间和不必要的处理。
预编译头文件stdafx.h在Microsoft Visual Studio中主要用于让编译器知道已经编译过的文件,而不需要从头编译。 你可以阅读更多相关内容
http://www.cplusplus.com/articles/1TUq5Di1/
https://learn.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/