想象我发布了一个C ++库,其包含的文件位于名为api
的文件夹中。
// file: api/mylib/fwd/foo.h
inline int mylib_foo();
// file: api/mylib/impl/foo.h
inline int mylib_foo() { return 42; }
在this question的上下文中,建议图书馆建设者始终使用“完整路径”。他们自己的(api)包含文件?
// file: api/mylib/all.h
#include "mylib/fwd/foo.h" // as opposed to "fwd/foo.h"
#include "mylib/impl/foo.h" // as opposed to "impl/foo.h"
或者可以接受预处理器经常'首先搜索包含文件夹?
如果您不想将/home/xtofl/libs/mylib/api
添加到编译器的包含路径,而是... #include "/home/xtofl/libs/mylib/api/mylib/all.h"
,或者甚至只需将mylib放在客户端代码旁边。< / p>
// file: api/mylib/all.h
#include "fwd/foo.h"
#include "impl/foo.h"
答案 0 :(得分:2)
N.B。这与项目的布局方式无关(正如问题的标题所示),因为在所有情况下,您都假设标题位于名为fwd
的子目录中。问题是在给定特定布局的情况下使用的#include
指令类型。无论如何...
在这个问题的背景下,图书馆建设者是否应该始终使用“完整路径”。他们自己的(api)包含文件?
// file: api/mylib/all.h
#include "mylib/fwd/foo.h" // as opposed to "fwd/foo.h"
#include "mylib/impl/foo.h" // as opposed to "impl/foo.h"
假设包含代码将api
dir添加到其搜索路径中,您已经提到了两种假设失败的方法:
如果您不想将
/home/xtofl/libs/mylib/api
添加到编译器的包含路径,而是...#include "/home/xtofl/libs/mylib/api/mylib/all.h"
,或者只是将mylib
放在旁边客户代码。
所以恕我直言这是更好的:
或者可以接受预处理器经常&#39;首先搜索包含文件夹?
是的,我认为依靠它会更好,并且做到:
// file: api/mylib/all.h
#include "fwd/foo.h"
#include "impl/foo.h"
处理api
在搜索路径中的情况,以及它不在的情况,以及mylib
在名为{{的目录中不存在的情况1}}。
它依赖于实现定义的规则,即搜索mylib
中包含的头文件在包含文件的目录中开始,但这对我所知的所有编译器都是通用的,并且比一个更安全的假设。关于文件安装位置的其他假设。