包含头文件 - 相对于当前目录还是包含目录?

时间:2012-01-08 19:09:06

标签: c++ header-files

我有以下直接结构:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h

lib1lib2都将被分发(安装)。 lib2使用lib1,因此需要一些包含:

#include "../lib1/lib1.h" // 1
#include "lib1/lib1.h"    // 2
#include <lib1/lib1.h>    // 3

(1)是直截了当的方式,但是非常不灵活。 (2)是我目前使用的方式,但构建系统需要知道需要将src添加到包含路径。 (3)在发行版方面对我来说似乎是最好的,因为可以假设标题位于标准位置,但对于我来说,构建系统如何处理它并不是很明显(在此如果需要在lib1编译之前安装lib2

推荐的方式是什么?

2 个答案:

答案 0 :(得分:11)

包含""<>形式的唯一区别是""在某些地方首先搜索,然后回退到与<>相同的位置。附加位置集是依赖于实现的,唯一常见的是包含include指令的文件的目录。添加到包含路径的编译器选项通常会添加<>表单,因此会搜索这两个表单。

因此,两种形式之间的选择主要是风格。使用当前项目的""表单和系统库的<>表单很常见。对于介于两者之间的事情,做出选择并在项目中坚持下去。

答案 1 :(得分:3)

我投票支持第2版。

#include "../lib1/lib1.h" // 1

这假设树将始终保持不变。因此,当您更改结构时,您需要在任何地方修改它。

#include "lib1/lib1.h"    // 2

我没有看到将src添加到包含路径的问题是什么。实际上,你甚至不需要将src添加到include路径,你可以直接添加src / lib1并且只有#include "lib1.h"

#include <lib1/lib1.h>    // 3

此样式的包含用于系统标头。您应该避免这种情况,因为大多数程序员习惯于在windows.h内看到stringvector<>。您还告诉编译器首先在默认目录中查找这些标头而不是您自己的标头。我会避免这个。

旁注:

你应该考虑这样的结构:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h
include

其中include目录包含所有公开可见的标头。如果lib1.h是公开的,请将其移至那里。如果没有,你现在的结构应该没问题。