#include父目录的文件

时间:2013-02-27 19:10:55

标签: c++ include cmake

我的文件夹结构是

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}}吗?

简而言之

我的算法目录中的某些文件需要包含其父文件夹中的定义。我无法模仿所有函数,因为类型很明显,而且会过度。 那我应该如何设计我的项目?

3 个答案:

答案 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”