我有一个具有以下目录结构的项目.
root
--include
----module1
----module2
--src
----module1
----module2
Run Code Online (Sandbox Code Playgroud)
因此,一个文件说,foo.cpp在src/module1有包括像,
#include "../../include/module1/foo.hpp"
Run Code Online (Sandbox Code Playgroud)
这看起来很混乱,很难写.我发现写作包括喜欢
#include <module1/foo.h>
Run Code Online (Sandbox Code Playgroud)
并提供包含文件搜索路径,以便root/include在编译时整洁.但是,我不确定这种风格有任何缺点.
您更喜欢哪一个?为什么?你也看到以上述方式组织文件有什么问题吗?
#include "../../include/module1/foo.hpp"
Run Code Online (Sandbox Code Playgroud)
应尽可能避免指定路径。编译器为您提供了一种更干净的替代方案来实现相同的目标。此外,干净的设计应该确保您不需要为了包含标头而权衡相对路径。
可以从标准中更好地了解使用哪一个(包括是否使用引号或尖括号)。
来自我的 C++ 草案副本:
16.2 源文件包含
2形式的预处理指令
#include <h-char-sequence> new-line`
Run Code Online (Sandbox Code Playgroud)
在一系列实现定义的位置中搜索由
<和之间的指定序列唯一标识的标头>分隔符之间的指定序列唯一标识的标头,并导致用标头的整个内容替换该指令。如何指定位置或标识标头是实现定义的。3形式的预处理指令
# include "q-char-sequence" new-line
Run Code Online (Sandbox Code Playgroud)
导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样
#include <h-char-sequence> new-line`
Run Code Online (Sandbox Code Playgroud)
具有与原始指令相同的包含序列(包括 > 字符,如果有的话)。
7虽然实现可以提供一种机制,使任意源文件可用于 < > 搜索,但一般来说,程序员应该对实现提供的标头使用 < > 形式,对实现控制之外的源使用“ ”形式。