【问题标题】:Include statement : c++包含语句:c++
【发布时间】:2014-06-14 17:16:37
【问题描述】:

好的,我有几行代码

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"
#include "windows.h"

环境是visualstudio 8,我正在学习OOP..

到目前为止我所知道的是(从我之前的学习背景来看)

  • 使用#include<iostream> 将在iostream.h 中搜索文件 标准包含库
  • 使用#include"myHeader.h"会在执行文件所在的目录中搜索一个文件myHeader.h,如果没有找到,则会去标准包含库中搜索

基于此,我很困惑,我的问题是

  1. 为什么每个标头都使用 qoutes?我相信 qoutes 属于存在执行代码的本地目录上的标头。而这些文件位于标准 lib 包含文件夹中?
  2. 我应该在哪里使用 qoutes 或在哪里不使用?
  3. 我可以看到带有几个文件的 .h 扩展名,但看不到它 其他...为什么会这样??

感谢您提出这些愚蠢的问题..但是很困惑..:(甚至阅读不同的资料也让我更加困惑,

编辑

根据第一个答案,

请指导我以正确和最佳的方式在我的情况下包含头文件(序列、Qoutes 和放置 .h)

附言 不知道为什么,但是这些文件包含正确,并且在编译器中不会出错(Visual Studio 8)

【问题讨论】:

  • #include <iostream> 搜索名为iostream 的文件,而不是iostream.h,除非编译器真的很奇怪。
  • 见问题3,.h 和文件名放在哪里?
  • @NewBee 您应该考虑升级到更新版本的 Visual Studio。微软主页有一个express version of the newest release可以下载

标签: c# c++ visual-studio include


【解决方案1】:

一一回答你的问题:

  1. 因为编写此代码的人犯了一个错误 - 当使用带引号的路径而不是尖括号时,search order is suboptimal 用于库标题。您的每个示例都应该改用尖括号。

  2. 无论何时使用库,都应使用尖括号,并且在包含自己的标头时应使用引号。两者之间的唯一区别是编译器将在哪里查找文件。类似的建议实际上是 C++11 标准 (16.2§7) 的一部分。

  3. 因为那些文件do not have an extension。在编写#include <iostream> 时,编译器将搜索名称恰好为iostream 的文件! (注意:这可以在其他实现中以不同的方式实现,因为从技术上讲,头文件根本不必是文件。)
    大多数人都同意您自己的标头应该有.h.hpp.hh 解决方案——这取决于个人喜好,但应始终如一地使用。

【讨论】:

  • re “当你包含自己的标题时,你应该使用引号”,文件的所有权没有可能的相关性,而且关于“图书馆”的建议与基于所有权的建议相矛盾——自相矛盾。
  • re“那些文件没有扩展名”,标准头不一定是文件。
  • @gha.st 使用“头文件或源文件”的措辞是因为头文件不一定是文件。第 16.6.1.2 节中关于标头的脚注 174 对此进行了更多解释:“标头不一定是源文件,标头名称中由 分隔的序列也不一定是有效的源文件名”。但是请注意,注释不是规范的(在 ISO 的规范意义上)。您所说的 OP 使用 MSVC 是“更重要的”,恕我直言,并非如此。环境仅与理解特定于环境的标头相关,您尚未解决。
  • re “这个建议实际上是 C++11 标准的一部分”,不,不是。但是,在 C++11 中,有一个关于区分 C++ 实现头文件和非实现头文件的建议。根据那个应该包括例如系统标头或 3rd 方库标头使用引号,这与基于所有权进行选择一样毫无意义且适得其反(冒着选择错误标头的风险)。啊。令人高兴的是,笔记不是规范的,但仍然......但是请注意,(坏的)建议与您的“犯了错误”的断言相矛盾。 ;-)
【解决方案2】:

#include <iostream> 包含一个标准标题。标准头不必是文件。它可以从数据库中检索,也可以在编译器中硬连线。但是当然通常的实现是它是一个文件,如果是,那么它很可能是一个名为“iostream”的文件,而不是一个名为“iostream.h”的文件。

quotes尖括号 之间的区别在于引号执行额外的搜索,之前(如果不成功)执行与尖括号完全相同的搜索。 p>

实际上,按照惯例,附加搜索位于包含文件的文件夹中。


请忽略有关使用一种或另一种形式的建议,具体取决于文件是您自己的还是其他人的。

使用适合手头工作的工具。

【讨论】:

    【解决方案3】:

    其实正如你所说,使用“”是可以的,因为当编译器在项目文件夹中找不到库时,它会在标准库中搜索它。所以对于这些头文件 或 "" 可以很好地完成工作,但是将 用于标准库会导致编译时间更快。

    关于.h扩展名:新的C++标准使用没有.h扩展名的库,所以当你使用<iostream.h>时它会加载旧的标准库,当使用<iostream>时会加载新的标准库。所以我建议你使用

    #include <iostream>
    using namespace std;
    

    【讨论】:

    • “新的 C++ 标准”——相对于旧的标准?
    • 没有任何 ISO C++ 标准曾经有一个头文件的扩展名不是 C 头文件。
    猜你喜欢
    • 2021-08-28
    • 2011-02-13
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2013-12-27
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多