为什么内联函数会导致编译器看不到OpenGL函数?

时间:2014-03-05 02:42:15

标签: c++ opengl inline

很抱歉,如果这个问题的标题措辞不好,但我有一个带有成员函数的类,而这个函数又会调用几个OpenGL函数:

class StateSet
{
public:
    StateSet();
    // ...

    inline void SetVertexAttributeEnabled(GLuint location,bool enabled)
    {
        if(m_GL_VERTEX_ATTRIB_ARRAY_ENABLED[location] == enabled) {
            return;
        }

        m_GL_VERTEX_ATTRIB_ARRAY_ENABLED[location] = enabled;
        if(enabled) {
            glEnableVertexAttribArray(location);
        }
        else {
            glDisableVertexAttribArray(location);
        }
    }
    // ...

在尝试编译时,我得到了

'glEnableVertexAttribArray' was not declared in this scope
'glDisableVertexAttribArray' was not declared in this scope

如果我没有使函数内联(取出'inline'关键字)并在相应的源文件中定义函数,它可以正常工作。源文件没有任何其他包含,它只包含头文件,而头文件又包括:

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

那么为什么内联使编译器无法“看到”OpenGL函数调用?

所有OpenGL函数都不会发生这种情况 - 如果我尝试调用glDrawArrays,glGet []等,我可以编译。

更多信息:

有问题的标题和源文件的所有包含都是:

#include <vector>
#include <cassert>
#include <sstream>
#include <iostream>

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

OpenGL及其上下文和所有内容都应由Qt设置;这个类在Qt应用程序中使用,我已经可以调用函数(glEnable / DisableVertexAttribArray),一切似乎都设置好了。

2 个答案:

答案 0 :(得分:0)

这也可能是名称空间问题,正在工作的东西可能是标题中的#defines,它们不受命名空间的影响,而在其中一个文件中,#include语句可能位于名称空间内。影响正常的功能定义。对不起,只是猜测,我绝对肯定有一些奇怪的事情发生。

答案 1 :(得分:0)

我能够通过将一个define选项传递给编译器来解决这个问题,而不是依赖于以下的定义宏:

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

我真的不知道为什么最终会起作用。我认为这意味着当编译器首次读入GL / glext.h时,未定义GL_GLEXT_PROTOTYPES。

我不确定预处理程序#defines以什么顺序生效但是我猜可能GL / glext.h首先包含在其他地方?