Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio “什么是”呢;stdafx.h“;在VisualStudio中使用?_Visual Studio_Visual Studio 2010_Visual C++_Cross Platform_Stdafx.h - Fatal编程技术网

Visual studio “什么是”呢;stdafx.h“;在VisualStudio中使用?

Visual studio “什么是”呢;stdafx.h“;在VisualStudio中使用?,visual-studio,visual-studio-2010,visual-c++,cross-platform,stdafx.h,Visual Studio,Visual Studio 2010,Visual C++,Cross Platform,Stdafx.h,当我在VisualStudio2010中启动项目时,将自动生成名为stdafx.h的文件。我需要制作一个跨平台的C++库,所以我不能/不能使用这个头文件。 stdafx.h用于什么?我删除这个头文件可以吗?它是一个“预编译头文件”——stdafx.h中包含的任何头文件都经过预处理,以节省后续编译的时间。你可以阅读更多关于它的内容 如果你正在构建跨平台的应用程序,在创建项目时检查“空项目”,VisualStudio将不会在项目中放置任何文件。 < P>所有C++编译器都有一个严重的性能问题需要处理

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

它是一个“预编译头文件”——stdafx.h中包含的任何头文件都经过预处理,以节省后续编译的时间。你可以阅读更多关于它的内容


如果你正在构建跨平台的应用程序,在创建项目时检查“空项目”,VisualStudio将不会在项目中放置任何文件。

< P>所有C++编译器都有一个严重的性能问题需要处理。编译C++代码是一个漫长而缓慢的过程。 < > C++文件顶部包含的编译头是一个非常长的、缓慢的过程。编译构成Windows API和其他大型API库一部分的巨大头结构是一个非常、非常、缓慢的过程。对每一个Cpp源文件都要一遍又一遍地重复,这简直是丧钟

这不是Windows独有的问题,而是所有编译器都必须针对大型API(如Windows)进行编译时所面临的老问题

微软编译器可以通过一个叫做预编译头的简单技巧来改善这个问题。诀窍非常巧妙:尽管每个CPP文件都可能在法律上赋予每个CPP文件顶部包含的头文件链略微不同的含义(比如在包含之前定义不同的宏,或者以不同的顺序包含头文件),但通常情况并非如此。大多数情况下,我们有几十个或数百个包含的文件,但它们对于应用程序中编译的所有Cpp文件都具有相同的含义

如果编译器不必每次从头开始编译每个Cpp文件及其几十个包含文件,那么它可以节省大量时间

这个技巧包括指定一个特殊的头文件作为所有编译链的起点,即所谓的“预编译头”文件,它通常是一个名为stdafx.h的文件,只是出于历史原因

只需在stdafx.h文件中以适当的顺序列出API的所有大标题,然后在每个CPP文件的最顶端添加一个
#include“stdafx.h”
,然后添加任何有意义的内容(之前只允许添加注释)

在这种情况下,编译器不会从头开始,而是从
stdafx.h
中编译所有内容的已保存结果开始编译

我不相信这个技巧是微软编译器独有的,我也不认为这是一个原创的开发

对于Microsoft编译器,控制预编译头使用的设置由编译器的命令行参数控制:
/Yu“stdafx.h”
。可以想象,使用
stdafx.h
文件名只是一种约定;如果您愿意,可以更改名称

在Visual Studio 2010中,通过右键单击CPP项目、选择“属性”并导航到“配置属性\C/C++\Precompiled Headers”,可以从GUI控制此设置。对于其他版本的Visual Studio,GUI中的位置将有所不同

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


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

我自己也遇到了这个问题,因为我试图创建一个基本框架,但一开始是在Visual Studio 2017中创建一个新的Win32程序选项。“stdafx.h”是不必要的,应该删除。然后,您可以删除解决方案资源管理器中愚蠢的“stdafx.h”和“stdafx.cpp”,以及项目中的文件。在它的地方,你需要把

#include <Windows.h>
#包括
相反。

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

预编译头stdafx.h基本上在Microsoft Visual Studio中用于让编译器知道一旦编译的文件,而无需从头编译。 你可以阅读更多关于它的内容


此文件中没有任何内容不适用于其他平台。如果编译器不支持预编译头,它可能会减慢那里的编译速度,但不应该破坏它。它只是一个包含其他头文件的头文件。@detunized:也许我的回答听起来不太一样,所以感谢您澄清这一部分。即使您只使用std名称空间中的文件,您也会得到一个速度优势,确实是一个非常好的答案。我正在寻找符合标准的c编译器。事实证明,我可以从项目属性中禁用micro$oft扩展,将编译器从“auto”更改为“c”,而您的编译器和IDE几乎都是“标准”的。@Rishi:所谓“行”,您的意思是
#包括“stdafx.h”
?当然,但这只是一个标准。“MS扩展”部分只是一个编译器性能优化;它不会改变头文件名为“stdafx.h”的语义。请注意,如果您删除了include,并且您的代码依赖于通过stdafx.h包含的任何内容,则必须直接包含它。@Youda008,不完全正确。在编译代码文件之前,请