在 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++语言#include<math.h>当中包含有啥函数