像OpenGL.h这样的头文件是如何工作的

时间:2015-07-27 13:13:32

标签: c++ opengl

我理解在编译包含它的源文件的其余部分之前处理头文件,以便更容易地开发代码。我也知道他们允许工作声明。但是,我没有看到头文件OpenGL.h中使用的函数,就像我在我研究过的所有教程中一样。使用#define extern,OpenGL.h对我来说非常模糊。我不知道发生了什么。例如

#define CGL_VERSION_1_0  1
#define CGL_VERSION_1_1  1
#define CGL_VERSION_1_2  1
#define CGL_VERSION_1_3  1


extern CGLError CGLQueryRendererInfo(GLuint display_mask,
CGLRendererInfoObj *rend, GLint *nrend);

extern CGLError CGLDestroyRendererInfo(CGLRendererInfoObj rend);
extern CGLError CGLDescribeRenderer(CGLRendererInfoObj rend, GLint
rend_num, CGLRendererProperty prop, GLint *value);

我不知道这里发生了什么,并且遇到了其他类似的默默无闻的c ++包含。我想写一个自己的库,我觉得popper头文件以这种方式概述。

对我来说,似乎所有发生的事情都是正在制作的关键字或变量,或者没有代码块的功能。我参加了2门c ++,入门和c ++课程,但他们没有详细介绍这个主题。

我只是想对正在发生的事情进行反混淆。

3 个答案:

答案 0 :(得分:3)

通常,库头文件不包含实现(例如,例外的是仅限标头的库,特别是对于加载的c ++模板代码)。标题只提供有关如何调用库函数的信息,即数据类型和签名。实施通常包含在static or shared library

严格来说,OpenGL甚至不是一个库,而是一个规范,而OpenGL实现通常作为共享库提供。也就是说,OpenGL函数的实现存储为一堆保存已编译代码的二进制数据。如果你真的想要这些资源,你需要检查你使用的OpenGL实现(例如,它可能是nvidia驱动程序,我怀疑真正的资源是否可用)。

为了理解这个编译代码如何与您的代码链接以及如何在此过程中涉及标头,我建议您阅读有关C ++编译过程以及静态和动态链接的更多信息。

答案 1 :(得分:3)

即使名称OpenGL.h可能另有建议,您也不会查看OpenGL头文件。这是CGL的标题,它是Mac OS上OpenGL的窗口系统界面。

窗口系统界面是一个依赖于平台的层,它在OpenGL和平台上的窗口系统之间形成“粘合剂”。此API用于配置和创建上下文,绘图表面等。​​它对应于Windows上的WGL,Linux上的GLX,Android上的EGL,iOS上的EAGL等。

如果要查看实际的OpenGL标头,请在同一目录中查找gl.hgl3.hgl.h适用于旧版OpenGL 2.1,gl3.h适用于OpenGL 3.x及更高版本的核心配置文件。

这些标头包含OpenGL API入口点的声明以及枚举的定义。需要声明这些函数,以便您可以在代码中调用它们。在C ++中,您无法调用未声明的函数。

函数的代码在OpenGL框架中,您可以链接到该框架。 Mac OS上的框架是一个包含头文件,库和一些相关文件的包。框架内的库包含API入口点的实际实现。

答案 2 :(得分:0)

在OpenGL中,你必须检索一个指向每个OpenGL函数的指针,它可以被使用;因此它们在运行时加载。该指针成为函数本身,虽然是为了显示为函数而为typedef。有些库可以为你做这些,比如glew,glLoadGen,glbinding来命名最突出的。 OpenGL.h将保存函数指针,并可能包含有关如何初始化OpenGL的一些上下文信息。

标题只包含函数原型;但是使用OpenGL会有所不同,因为您只需要指向函数的指针而不是实际的函数本身。