Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #包括父目录';s文件_C++_Include_Cmake - Fatal编程技术网

C++ #包括父目录';s文件

C++ #包括父目录';s文件,c++,include,cmake,C++,Include,Cmake,我的文件夹结构是 libA x.h y.h algorithm/ a.h 现在在a.h中,我有#包括“libA/x.h”,它不起作用。它搜索算法/libA/x.h。那么我应该使用#include“./x.h”?第二种选择是一种糟糕的设计吗?目前,libA只是标题。但后者我可以选择将其编译为库 我正在使用cmake,因此我可以或应该在我的include路径中添加libA 简言之 “我的算法”目录中的某些文件需要包含其父文件夹中的定义。我不能使所有函数都模板

我的文件夹结构是

libA
    x.h
    y.h
    algorithm/
        a.h
现在在
a.h
中,我有
#包括“libA/x.h”
,它不起作用。它搜索
算法/libA/x.h
。那么我应该使用
#include“./x.h”
?第二种选择是一种糟糕的设计吗?目前,libA只是标题。但后者我可以选择将其编译为库

我正在使用cmake,因此我可以或应该在我的include路径中添加
libA

简言之 “我的算法”目录中的某些文件需要包含其父文件夹中的定义。我不能使所有函数都模板化,因为类型是明显的,这将是过度的。
那么我应该如何设计我的项目呢?

如果您使用的是gcc,您可以添加-IPathTo/libA将libA添加到文件夹列表中,然后使用#include“x.h”

在创建我知道将在其他项目中使用的库时,我倾向于使用boost的includecision样式:

#包括

这意味着,只要“libA”(可能是
/include
)上面的文件夹存在,您就可以引用“libA”下面的任何内容。它还有助于在包含boost样式的内容时避免名称类似的包含文件的冲突,因为在库中以及库的标题和其他相关代码之外,您总是指定要从中提取“x.h”的库,例如

#include <SexyLib/x.h> // Two different x.h
#include <TheLibFarAway/x.h>  // but same name! I hope you also have Namespaces :D
#包括//两个不同的x.h
#包括//但名称相同!我希望您也有名称空间:D
这只是个人的偏好,但对于我正在开发的库和
boost
来说似乎效果不错。希望有帮助

使用
#include“./x.h”
的解决方案将起作用。关于这是否是糟糕的设计-可能是;在不了解更多代码的情况下很难判断

请考虑这样一个事实:如果您有许多包含路径,编译器/预处理器将查找
。/x.h
就是其中的所有路径,这可能是无意的,而且太宽了

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

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

这是危险的。如果删除/重命名真实的
x.h
,编译器将自动选择
您的_code/。/x.h
,其中包含不相关的内容-这可能会导致隐藏的错误消息。甚至更糟糕的是,这可能是一个旧版本,充满了bug

“那么我应该使用
#include”。/x.h
”-你试过吗?你的编译器(或者更准确地说是预处理器)是什么关于路径的看法?我正在使用gcc,但它也应该与msvc一起使用。但我从未见过这些编译器拒绝
。/
#include
@DiproSen中。我的答案被删除了,没有任何评论。我希望它在那里有用。作为对你评论的回应,我会检查算法是否真的依赖于x和y,或者不是这些类所呈现的特征?我本可以将算法中的函数模板化。但在某些情况下,这种类型很明显,将这些函数模板化会过度。因此我需要包括。但我需要将与算法相关的文件也分组
\include
也不起作用。它抱怨没有此类文件。现在我f I添加包含路径libA用户将需要执行相同的操作,否则它将不会执行compile@DiproSen好吧,想一想。你也必须对boost做同样的事情:你将顶级boost文件夹添加到你的INCLUDE路径,然后使用
#INCLUDE
。除非用户将你的lib文件添加到编译器总是进行搜索(大多数用户通常不会这样做)。因此,请告诉他们添加包含目录;这是您所能做的最好的事情。但是,没有人可以复制粘贴子目录中的文件夹并开始使用它。要详细说明吗?