16

我的文件夹结构是

libA
    x.h
    y.h
    algorithm/
        a.h

现在a.h我有#include "libA/x.h"哪个不起作用。它正在寻找algorithm/libA/x.h. 那我应该使用#include "../x.h"吗?第二种选择是一个糟糕的设计吗?目前 libA 只是标题。但后者我可能会选择将其编译为库

我正在使用 cmake 那么我可以或应该添加libA我的包含路径吗?

简而言之

My algorithm 目录中的某些文件需要包含其父文件夹中的定义。我不能将所有函数都模板化,因为类型很明显,而且会过度。那么我应该如何设计我的项目?

4

3 回答 3

8

您的解决方案#include "../x.h"将起作用。关于这是否是糟糕的设计——可能是;如果不了解您的代码,很难说。

考虑一个事实,如果您有许多包含路径,编译器/预处理器将寻找../x.h所有这些路径,这可能是无意的并且太宽泛了!

假设您具有以下目录结构,并且Your_Code位于包含文件的搜索路径中。

Unrelated_Directory/
    x.h - unrelated
    Your_Code/
        libA/
            x.h - the real one
            algorithm/
                a.h

这是危险的。如果你删除/重命名你的 real x.h,编译器会默默地挑选Your_Code/../x.h,其中包含不相关的东西 - 这可能会导致神秘的错误消息。或者更糟糕的是,这可能是一个旧版本,充满了错误!

于 2013-02-27T21:00:36.340 回答
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都很有效。希望有帮助!

于 2013-02-27T20:13:37.760 回答
1

如果您使用 gcc,您可以添加 -IPathTo/libA 以将 libA 添加到文件夹列表中,然后使用 #include "xh"

于 2013-02-27T19:38:17.823 回答