我的文件夹结构是
libA
x.h
y.h
algorithm/
a.h
现在a.h
#include "libA/x.h"
我的algorithm/libA/x.h
无效。它搜索#include "../x.h"
。我应该使用libA
吗?第二种选择是不好的设计吗?目前libA只是标题。但后者我可能选择将其编译为库
我正在使用cmake所以我可以或者应该在我的包含路径中添加{{1}}吗?
我的算法目录中的某些文件需要包含其父文件夹中的定义。我无法模仿所有函数,因为类型很明显,而且会过度。 那我应该如何设计我的项目?
答案 0 :(得分:4)
使用#include "../x.h"
的解决方案可行。关于这是否是糟糕的设计 - 可能是它;在不了解您的代码的情况下很难分辨。
考虑一下这样一个事实:如果你有很多包含路径,编译器/预处理器会查找../x.h
就是所有这些路径,这可能是无意的而且太宽泛了!
假设您具有以下目录结构,并且Your_Code
位于包含文件的搜索路径中。
Unrelated_Directory/
x.h - unrelated
Your_Code/
libA/
x.h - the real one
algorithm/
a.h
这很危险。如果删除/重命名真正的x.h
,编译器将默默选择Your_Code/../x.h
,其中包含不相关的内容 - 这可能会导致隐藏的错误消息。或者更糟糕的是,这可能是一个旧版本,充满了错误!
答案 1 :(得分:2)
当我创建一个我将在其他项目中使用的库时,我倾向于使用boost的包含样式:
#include <libA/x.h>
这意味着只要“libA”(可能是/include
)上方的文件夹存在,您就可以使用“libA”引用任何内容和所有内容。当你包含boost风格的东西时,它还有助于避免类似命名的包含文件的冲突,因为在你的库和库的标题和其他相关代码之外,你总是指定要从中拉出“xh”的库,例如
#include <SexyLib/x.h> // Two different x.h
#include <TheLibFarAway/x.h> // but same name! I hope you also have Namespaces :D
这只是个人偏好,但对于我正在开发的库和boost
来说似乎也很好。希望有所帮助!
答案 2 :(得分:-1)
如果您使用的是gcc,可以添加-IPathTo / libA将libA添加到文件夹列表中,然后使用#include“x.h”