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

wal*_*mat 9 c++ header-files

我有以下直接结构:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h
Run Code Online (Sandbox Code Playgroud)

双方lib1lib2都打算进行分配(安装).lib2利用lib1,所以它需要一些包括:

#include "../lib1/lib1.h" // 1
#include "lib1/lib1.h"    // 2
#include <lib1/lib1.h>    // 3
Run Code Online (Sandbox Code Playgroud)

(1)是直截了当的方式,但是非常不灵活.(2)是我目前使用的方式,但构建系统需要知道src需要添加到包含路径.(3)在分发方面对我来说似乎是最好的,因为可以假设标题位于标准位置,但对于我来说,构建系统如何处理它(在这种情况下,lib1需要先安装)lib2可以编译).

推荐的方式是什么?

APr*_*mer 13

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

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


Luc*_*ore 5

我投票给版本 2。

#include "../lib1/lib1.h" // 1
Run Code Online (Sandbox Code Playgroud)

这假设树将始终保持不变。因此,当您更改结构时,您需要在各处进行修改。

#include "lib1/lib1.h"    // 2
Run Code Online (Sandbox Code Playgroud)

我不明白将 src 添加到包含路径有什么问题。实际上,你甚至不需要将 src 添加到包含路径中,你可以直接添加 src/lib1 即可#include "lib1.h"

#include <lib1/lib1.h>    // 3
Run Code Online (Sandbox Code Playgroud)

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

边注:

你应该考虑这样的结构:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h
include
Run Code Online (Sandbox Code Playgroud)

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