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文件添加到编译器总是进行搜索(大多数用户通常不会这样做)。因此,请告诉他们添加包含目录;这是您所能做的最好的事情。但是,没有人可以复制粘贴子目录中的文件夹并开始使用它。要详细说明吗?