为啥我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`?

Posted

技术标签:

【中文标题】为啥我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`?【英文标题】:Why do we use `#include "stdafx.h"` instead of `#include <stdafx.h>`?为什么我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`? 【发布时间】:2016-05-16 15:36:04 【问题描述】:

来自here,据说:

对于#include "filename",预处理器在相同的搜索 目录作为包含指令的文件。这种方法是 通常用于包含程序员定义的头文件。

对于#include &lt;filename&gt;,预处理器在实现中搜索 依赖方式,通常在由预先指定的搜索目录中 编译器/IDE。此方法通常用于包含标准库 头文件。

虽然this wiki link暗示stdafx.hvisual studio IDE预先设计的头文件

stdafx.h 是一个文件,由 Microsoft Visual Studio IDE 向导生成, 描述标准系统和项目特定的包含文件 经常使用但几乎不会改变。

兼容的编译器(例如,Visual C++ 6.0 和更高版本)将 预编译此文件以减少总体编译时间。 Visual C++ 将 在源代码中的#include "stdafx.h" 之前不编译任何东西 文件,除非编译选项 /Yu'stdafx.h' 未选中(通过 默认);它假定源代码中的所有代码都包括在内 行已经编译。

stdafx.h 中的 AFX 代表应用程序框架扩展。 AFX 是 Microsoft Foundation Classes 的原始缩写 (MFC)。虽然默认使用名称 stdafx.h,但项目可能 指定替代名称。

然后

为什么我们使用#include "stdafx.h" 而不是#include &lt;stdafx.h&gt;

【问题讨论】:

也许 where Visual Studio 默认生成该标题可能有助于回答您自己的问题。 【参考方案1】:

stdafx.h, stdafx.cpp 对是由 VS 从模板生成的。它驻留在同一目录中,其余文件结束。您可能最终会专门为您的项目更改它。因此,我们使用 "" 而不是 &lt;&gt; 正是因为它与您的第一个报价所述位于同一目录中。

【讨论】:

好的,我在...\testMEX\testMEX\Debug...\testMEX\testMEX 中看到了stdafx.objstdafx.hstdafx.cpp,其中testMEX 是我的控制台应用程序项目的名称 所以你的意思是 1- 文件 stdafx.hstdafx.cpphandler_stdafx.hhandler_stdafx.cppC:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCWizards\AppWiz 的不同子文件夹 (.NET, ATL, Generic, MFC) 中 2- 文件 Stdafx.h、@987654338 @,Stdafx.cppStdAfx.cpp在目录的不同部分C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensibility Projects 3-文件stdafx.hstdafx.cppC:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc目录的不同子文件夹(include, lib, src)中4-文件stdafx.h,跨度> stdafx.cpp 在我的C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK\Samples\DIA2Dump 目录中的Win7x64 机器都是模板。当我们在Visual Studio 2010 中启动一个新项目时,会根据项目类型并使用这些模板为此创建一个特殊的stdafx.h 文件? 我已经在我的代码中包含了#include "stdafx.h",但我收到错误“无法打开源文件“stdafx.h”和“无法包含文件:”stdafx.h “: 没有相应的文件和目录。有谁知道我该如何解决这个问题?【参考方案2】:

因为stdafx.h 对于每个项目都是不同的。正如您所引用的,#include "" 搜索当前项目的路径,这就是 stdafx.h 所在的位置。

使用#include &lt;stdafx.h&gt; 将是一个巨大 错误,因为它必须位于库路径中(所有标准库头文件所在的位置)。这意味着您不应该修改它,或者它始终保持不变,但对于不同的项目来说永远不会相同。

因此,即使它是由 Visual Studio 生成的,它也特定于项目,而不是所有项目。

【讨论】:

【参考方案3】:

一般来说,对于给定的包含文件名.h,语法#include &lt;name&gt; 保留给standard libraries,而#include "name.h" 用于用户定义的文件。在那里,“用户”可能意味着任何实现非标准功能的开发人员,例如针对特定编译器包。

因此,预处理器会按照系统设置指定的合适路径搜索包含文件。不仅要注意括号和引号之间的区别,还要注意 *.h 扩展名的不同用法。

【讨论】:

以上是关于为啥我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`?的主要内容,如果未能解决你的问题,请参考以下文章

ajax上传文件,为啥后台接收的一直为空

为啥我会在这个程序中“中止”? [复制]

vs2010为啥增加了#include<windows.h>和system("pause");后程序出错

为啥使用 st_intersection 而不是 st_intersects?

stm32 串口发送数组 为啥串口发送不出去我打印的四个数字

为啥我在这里收到与内存相关的错误?