【问题标题】:How should a C++ api be laid out?C++ api应该如何布局?
【发布时间】:2016-11-18 07:46:38
【问题描述】:

假设我正在发布一个 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"

【问题讨论】:

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


    【解决方案1】:

    注意这与项目的布局方式无关(如您的问题标题所述),因为在所有情况下,您都假设标题位于名为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 目录添加到其搜索路径,并且您已经提到了假设可能失败的两种方式:

    如果您不想将/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 "..." 包含的头文件,但这对我知道的所有编译器都是通用的,并且比其他关于文件位置的假设更安全已安装。

    【讨论】:

    • 图书馆是否应该使用带引号的包含?看看 Boost 和 Qt,他们没有。您始终必须指定包含路径,或将它们安装到“常用位置”。
    猜你喜欢
    • 2013-09-28
    • 2011-11-18
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2014-06-07
    • 2012-01-25
    • 2017-03-30
    相关资源
    最近更新 更多