21 November 2023

C++ 核心指南目录

“Prefer the quoted form of #include for files relative to the including file and the angle bracket form everywhere else”

理由

C++ 标准规定两种形式的 #include 一种是尖括号(<>),一种是双引号(“”),编译器可以灵活选择进行实现。工具厂商也可以利用两种形式的差别,选择不同的路径搜索算法。

然而,本指南建议,头文件的路径如果是相对路径,则使用引号形式。其他情况则使用尖括号。这样的使用方式,可以清晰区分相对路径的头文件和其他需要特定搜索算法的头文件。这样也可以清晰区分哪些头文件是相对的局部头文件,哪些是标准库的头文件。

例子

// foo.cpp:
#include <string>                // From the standard library, requires the <> form
#include <some_library/common.h> // A file that is not locally relative, included from another library; use the <> form
#include "foo.h"                 // A file locally relative to foo.cpp in the same project, use the "" form
#include "foo_utils/utils.h"     // A file locally relative to foo.cpp in the same project, use the "" form
#include <component_b/bar.h>     // A file in the same project located via a search path, use the <> form

注意

不遵循这条指南的话,会很难诊断出是否选用了错误的头文件。比如说, #include "" 一般会优先选择局部的相对的路径,然后查找非局部的非相对的路径。这就意味着,如果之前局部相对路径没有某个头文件,后来添加了这个头文件,编译器就会选用这个新添加的头文件。这时候,就会得到预料之外的结果了。

程序库的作者应当把头文件放在特定系统路径,然后要求使用者以尖括号的方式包含到代码中: #include <some_library/common.h>

强化

要能检测出本该用 <> 的地方,用了 ""