在 C++ 库中隐藏 C 头文件中的函数

Posted

技术标签:

【中文标题】在 C++ 库中隐藏 C 头文件中的函数【英文标题】:Hide functions from C header in C++ library 【发布时间】:2016-03-13 03:59:35 【问题描述】:

我正在为我的一些朋友开发一个小型游戏引擎,并且我正在使用 OpenGL(以及 GLFW 和 GLEW 以及所有这些东西)进行渲染。您可能知道,OpenGL 是一个 C 库,因此不包含类。现在,我不希望我的朋友(或我自己)看到来自 glfw3.h 和 glew.h 的所有 gobbledygook,我想知道是否有一种简单的方法可以向用户隐藏此类内容。

我知道在很多情况下,在这种情况下可能会尝试 pimpl,但问题是,我所拥有的只是函数。我可以将它们全部放在一个静态类或命名空间中,然后由必要的类包含,但这仍然不会对用户隐藏这些功能。我唯一想到的就是函数指针的奇怪和麻烦,但我会经常使用这些函数,以至于它会减慢开发速度。

最后,我想如果像glVertexAttribPointer 这样的可怕东西是可见的,那也不会很糟糕,但这只是我想要的东西。提前致谢。

【问题讨论】:

您是否尝试过在库的头文件中不包含GL.h @Dolda2000 好吧,如果我实际使用gl.h,那会起作用,但是所有这些功能都来自glfw3.h,我经常在我的课程中用作私有成员的类型。然而,这是一个有趣且明显的点,我根本没有考虑过。我只是不知道如何将glfw3.h中的OpenGL相关函数与GLFW相关函数分开。 使用 PIMPL 成语:***.com/questions/60570/…。基本上也使用 GL 标头将内容隐藏在用户的视线之外。 @user4581301 如果 glfw/opengl 不是该死的 C 库,这也可以工作。无论如何,这将禁止用户使用方便的类,例如engine::Window,因为该类需要GLFWwindow 成员,该成员位于glfw3.h 中,所有OpenGL 函数也都在其中。我想我可以编辑头文件,但这并不是最好的主意……不过还是感谢您的建议。 gl 类结合 pimpl 可以工作;只是有点痛苦 是否是 C 库无关紧要。客户端只能看到未在标头中定义的前向定义的 PIMPL 类和指向前向定义的 PIMPL 类的指针。这个 PIMPL 类的实现隐藏在 CPP 文件中的公共视图之外,并包装了所有需要的 C 功能。只有 CPP 文件需要包含 C 头文件并了解有关 C 库的任何信息。您的所有其他类都调用 PIMPL 类,可能使用前向定义和不向客户端公开的标头。 【参考方案1】:

您是否从来没有想过要真正查看glfw3.h 并查看GLFWwindow 是如何定义的?

/*! @brief Opaque window object.
 *
 *  Opaque window object.
 *
 *  @see @ref window_object
 *
 *  @since Added in version 3.0.
 *
 *  @ingroup window
 */
typedef struct GLFWwindow GLFWwindow;

你不能在 markdown 代码部分强调单词太糟糕了。里面有一个重要的小词:不透明

GLFWwindow 已作为前向结构声明写入标头。这意味着你只能创建它的指针变量。

所以在你的类中,如果你只需要一个指针,在定义你的类之前添加一个相同的前向声明,这是完全可以接受的模式,即

typedef struct GLFWwindow GLFWwindow;

class whatever 
    /* ... */
    GLFWwindow *wnd;
    /* ... */
;

然后您可以在 C++ 编译单元源文件中包含 glfw3.h


但是你为什么还要关心呢? 据你所知,使用你的库的人可能会故意包含 OpenGL 头文件。您包括 GLFW,而 GLFW 包括 OpenGL 标头。因此,无论谁要使用您的库,都将依赖于嵌套类型定义。

努力“隐藏”事物很少有什么好处。只要你不污染命名空间就接受它。

唉,划分的原因有一个:加快编译时间:包含的头文件越少越好。

【讨论】:

reddit.com/r/learnprogramming/comments/2yhjwe/… ;) 我也爱你,伙计 @Naerion:实际上这并不是敌意或贬低你的意思。相反:我试图鼓励你不要花太多心思在这件事上,并鼓励你“采取大胆的行动”(通过“欺骗”进行前向声明)或根本不给予 eff。 很公平。误会见谅

以上是关于在 C++ 库中隐藏 C 头文件中的函数的主要内容,如果未能解决你的问题,请参考以下文章

C++中的cmath头文件

conio.h是哪个头文件?

C语言怎么把自定义头文件添加到函数库中

在c++语言#include<math.h>当中包含有啥函数

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

编译和连接 - 笔记 5