如何构建C ++ API?

时间:2016-07-15 07:31:28

标签: c++ shared-libraries c-preprocessor header-files include-path

想象我发布了一个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"

1 个答案:

答案 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中包含的头文件在包含文件的目录中开始,但这对我所知的所有编译器都是通用的,并且比一个更安全的假设。关于文件安装位置的其他假设。