2

想象我正在发布一个C++库,它的包含文件位于名为api的文件夹中。应该如何布置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放在客户端代码旁边。

// file: api/mylib/all.h 
#include "fwd/foo.h" 
#include "impl/foo.h" 

回答

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放在客户端代码旁边。

所以恕我直言,这是更好的:

或可能是可以接受的依靠事实预处理“经常”首先搜索,包括文件夹?

是的,我认为这是更好地依靠这一点,做到:

// file: api/mylib/all.h 
#include "fwd/foo.h" 
#include "impl/foo.h" 

,它处理api是在搜索路径的情况下,以及它不是这种情况,和情况mylib根本不在名为mylib的目录中。

它依赖于实现定义的规则,即在包含文件的目录中搜索包含#include "..."的头文件,但这对于我所知的所有编译器都是常见的,并且比其他文件的假设更安全安装。

+0

图书馆是否应该引用包括?看着Boost和Qt,他们没有。你总是必须指定包含路径,或者将它们安装到'平常的地方'。 – xtofl