C++ C++#包含语义

C++ C++#包含语义,c++,c-preprocessor,C++,C Preprocessor,对于同一预处理指令,这是一个多问题 1-或“? 除了MSDN中的信息外: 1.a:这两种符号有什么区别? 1.b:所有编译器都以相同的方式实现它们吗? 1.c:您将在何时使用,以及何时使用“”(即,您将在标题中使用其中一个或另一个的标准是什么)? 2-#包括{TheProject/TheHeader.hpp}或{TheHeader.hpp}? 我见过至少两种写项目标题的方法。 考虑到您至少有4种类型的标头,即: #include <cstdlib> #include <vec

对于同一预处理指令,这是一个多问题

1-或“? 除了MSDN中的信息外:


1.a:这两种符号有什么区别?
1.b:所有编译器都以相同的方式实现它们吗?
1.c:您将在何时使用,以及何时使用“”(即,您将在标题中使用其中一个或另一个的标准是什么)?

2-#包括{TheProject/TheHeader.hpp}或{TheHeader.hpp}? 我见过至少两种写项目标题的方法。 考虑到您至少有4种类型的标头,即:

#include <cstdlib>
#include <vector>
  • 项目的私有标题
  • 项目的标题,但正在导出符号(因此为“公共”)
  • 模块链接到的另一个项目的标题
  • 编译器或标准库的标题
对于每种标题:

2.a:您会使用或“?
2.b:您是在{TheProject/TheHeader.hpp}中包含,还是只在{TheHeader.hpp}中包含?

3-奖金 3.a:您是否在一个树状组织(即目录中的目录,而不是“一个目录中的每个文件”)中使用源和/或标题来处理项目?如果我没记错的话,有哪些优点/缺点

在“路径”中可以找到的所有库都使用菱形。因此,STL中的任何库,或您已安装的库。在Linux中,您的路径通常是“/usr/include”,在windows中,我不确定,但我猜它在“C:\windows”下

然后使用“”指定其他所有内容。没有起始目录信息的“my_bla.cpp”将解析为代码所在/编译的目录。或者,您也可以指定包含的确切位置。像这样的“c:\myproj\some\u code.cpp”

标题的类型并不重要,只是位置而已。

我通常将“”用于系统标题,将“”用于项目标题。至于路径,只有当您想要的文件位于包含路径的子目录中时,才需要这样做

例如,如果您需要/usr/include/SDL/中的一个文件,但include路径中只有/usr/include/,那么您可以使用:

#include <SDL/whatever.h>
#包括
另外,请记住,除非放置的路径以/开头,否则它是相对于当前工作目录的

编辑以回答注释:这取决于,如果一个库只有几个包含,我只会在包含路径中包含它的子目录,但是如果库有许多头(比如几十个),那么我更喜欢将它放在我指定的子目录中。Linux的系统头就是一个很好的例子。您使用它们的方式如下:

#include <sys/io.h>
#include <linux/limits.h>
#包括
#包括
等等


编辑以包含另一个好的答案:另外,如果可以想象两个或多个库以相同的名称提供头,那么子目录解决方案基本上为每个头提供一个名称空间。

我使用from-system头文件(stdio、iostreams、string等)和“…”来表示特定于该项目的头

之间有两个主要区别。第一个是名称的结尾字符-头名称中没有转义序列,因此您可能会被迫执行
#include file.cpp“
。但这可能不会经常出现。另一个区别是系统包含不应该出现在
,而只是
。因此
\include“iostream”“
不保证有效<代码>#包括是。我个人的偏好是对属于项目一部分的文件使用
,对不属于项目一部分的文件使用
。有些人只对标准库标题使用
,对其他所有标题使用
。有些人甚至只用
来治疗Boost和std;这取决于项目。像所有风格方面一样,最重要的是保持一致

对于路径,外部库将指定头的约定;e、 g.
。在本地项目中,我将编写与顶级srcdir相关的所有路径(或者在不同的库项目中,编写include目录)

在编写库时,您可能会发现使用区分私有和公共头很有帮助,或者不要
-I
源目录,而是上面的目录,因此您可以
#包括“public_header.hpp”
“src/private_header.hpp”
。这真的取决于你


编辑:对于具有目录结构的项目,我强烈推荐它们。想象一下,如果所有boost都在一个目录中(并且没有子名称空间)!目录结构很好,因为它可以让您更容易地查找文件,并允许您在命名方面更灵活(
“module\\u text\\u processor.hpp”
,而不是
“module/text\\u processor.hpp”
)。后者更自然,更易于使用。

我将回答你问题的第二部分:

当我包含来自第三方的标题时,我通常使用
。和
“myHeader.h”
在项目中包含标题时


我使用
而不是
的原因是,可能有多个库有一个“libHeader.h”文件。为了包含它们,您需要将库名称作为包含文件名的一部分。

引用C99标准(乍一看,C90标准中的措辞似乎相同,但我无法从中剪切粘贴):

表单的预处理指令

  #include <h-char-sequence> new-line
  #include "q-char-sequence" new-line
#包括“q-char-sequence”新行

导致更换该设备 指令的全部内容 由 在“”之间指定的顺序 分隔符。命名的源文件为 寻找 实现定义的方式。如果 不支持搜索,或者如果 搜索失败,指令无效 重新处理,就像它读取

  #include <h-char-sequence> new-line
#include <h-char-sequence> new-line
  #include "q-char-sequence" new-line
  #include <h-char-sequence> new-line
#include <MyLocalProject/Header.hpp>
#include <GlobalInclude/Header.hpp>
#include "Header.hpp"
#include <Header.hpp>
#include <cstdlib>
#include <vector>