为啥我们使用 `#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 <filename>
,预处理器在实现中搜索 依赖方式,通常在由预先指定的搜索目录中 编译器/IDE。此方法通常用于包含标准库 头文件。
虽然this wiki link暗示stdafx.h
是visual 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 <stdafx.h>
?
【问题讨论】:
也许 where Visual Studio 默认生成该标题可能有助于回答您自己的问题。 【参考方案1】:stdafx.h
, stdafx.cpp
对是由 VS 从模板生成的。它驻留在同一目录中,其余文件结束。您可能最终会专门为您的项目更改它。因此,我们使用 ""
而不是 <>
正是因为它与您的第一个报价所述位于同一目录中。
【讨论】:
好的,我在...\testMEX\testMEX\Debug
和...\testMEX\testMEX
中看到了stdafx.obj
、stdafx.h
、stdafx.cpp
,其中testMEX
是我的控制台应用程序项目的名称
所以你的意思是 1- 文件 stdafx.h
、stdafx.cpp
、handler_stdafx.h
、handler_stdafx.cpp
在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCWizards\AppWiz
的不同子文件夹 (.NET, ATL, Generic, MFC)
中 2- 文件 Stdafx.h
、@987654338 @,Stdafx.cpp
,StdAfx.cpp
在目录的不同部分C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensibility Projects
3-文件stdafx.h
,stdafx.cpp
在C:\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 <stdafx.h>
将是一个巨大 错误,因为它必须位于库路径中(所有标准库头文件所在的位置)。这意味着您不应该修改它,或者它始终保持不变,但对于不同的项目来说永远不会相同。
因此,即使它是由 Visual Studio 生成的,它也特定于项目,而不是所有项目。
【讨论】:
【参考方案3】:一般来说,对于给定的包含文件名.h,语法#include <name>
保留给standard libraries,而#include "name.h"
用于用户定义的文件。在那里,“用户”可能意味着任何实现非标准功能的开发人员,例如针对特定编译器包。
因此,预处理器会按照系统设置指定的合适路径搜索包含文件。不仅要注意括号和引号之间的区别,还要注意 *.h 扩展名的不同用法。
【讨论】:
以上是关于为啥我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`?的主要内容,如果未能解决你的问题,请参考以下文章
vs2010为啥增加了#include<windows.h>和system("pause");后程序出错
为啥使用 st_intersection 而不是 st_intersects?