假设我正在用 C++ 编写一个名为 foo 的库。当安装到
/some/where
时,它会在/some/where/include/foo
中呈现包含文件,我希望用户使用-I/some/where/include
进行编译。
假设 foo 有头文件
foo/first.hpp
、foo/second.hpp
和 foo/bar/third.hpp
(并且它们在安装前后都有这些相对位置)。
现在,在这些文件中,当包含其他 foo 头文件时,我应该...
#include <foo/second.hpp>
#include <foo/bar/third.hpp>
#include "second.hpp"
#include "bar/third.hpp"
或者
#include "../first.hpp"
我注意到 Boost 似乎采用了方法 (1.),我喜欢它,因为它澄清了这些包含文件是 foo 库的一部分。然而,这个SO问题的公认答案建议采用方法(2.)(尽管是针对C语言)。
C++ 编码指南 SF.12 对于这个问题实际上有些含糊。一方面,它说:
使用引用的形式包含存在于包含 #include 语句的文件的相对路径中的文件(来自同一组件或项目),并在其他地方使用尖括号形式
但是也
库创建者应将其标头放入文件夹中,并让客户端使用相对路径包含这些文件
#include <some_library/common.h>
但是库也是它自己的包含文件的客户端;如果您已将标头放入特定于库的文件夹中,那么也许此规则适用(因为当使用特定于库的文件夹时,先前规则的基本原理似乎不成立)。
考虑了一段时间后,我决定它必须是引号和相对路径。
您不希望选择包含路径而导致错误地包含错误的文件;无论其他什么,带引号的包含路径都保证为您提供正确的包含。
(警告:这是假设库中的包含文件和被包含文件之间的相对路径在安装后保持不变,否则这是一个不同的游戏。)