不能在 .h 文件 C++ 中使用 glGenBuffers

Can't use glGenBuffers in .h file C++

我正在尝试学习 C++ 中的 OpenGL。为了清理我的代码,我试图创建一个包含所有变量的 header 文件,其中描述了 objects。这个 header 看起来像这样:

#pragma once

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <stb/stb_image.h>

namespace data {

    ...

    float fragments[] = {...}
    int indices[] = {...}

    ...

}

我想将 VAO 和 VBO 添加到此命名空间,但一旦我尝试使用 glGenBuffersglGenVertexArray:

来实现它们
unsigned int VBO;
glGenBuffers(1, &VBO);

IDE (Visual Studio) 向我指出了一个错误,它说“此声明不包括存储 class 或类型标识符”(参考 glGenBuffer 功能;我的编辑器设置为意大利语,因此我的翻译可能不完美)。我还尝试在这个命名空间中添加一个 class (即使在我的开始计划中我想避免这种方法):

#include <...>

namespace data {


    class Data {
 
        public:
            unsigned int VBO;
            glGenBuffers(1, &VBO)

    };
    

}

这次我得到的错误是:“缺少显式类型。它将被使用 int”(指 glGenBuffers 函数;保留我之前写的内容:翻译可能不完美,但是我觉得可以理解)。 作为最后一次尝试,我也尝试在 main.cpp 文件中的 main 函数下实现命名空间。我得到的错误与第一个错误相同,但如果我在 main 中使用这些函数调用,它们就会起作用。我也已经按照 this 指南编写了一些其他 classes,例如 shader.hcamera.h,并且我能够(使用必要的包含,例如 glad/glad.h) 使用 gl* 函数,例如 glCreateShaderglCreateProgramglAttachShader 等。

来自 OP 的片段:

namespace data {


    class Data {
 
        public:
            unsigned int VBO;
            glGenBuffers(1, &VBO)

    };

}

这是语法错误。 glGenBuffers(1, &VBO) 是函数体块作用域外的函数调用。你必须移动它,例如进入 class Data 的构造函数。充其量,您可以将其放入用作 Data::VBO:

的初始化程序的 lambda 中
namespace data {


    class Data {
 
        public:
            unsigned int VBO
              = []() { unsigned int VBO; glGenBuffers(1, &VBO); return VBO; }();

    };
    

}

看起来有点绕?由于 glGenBuffers() 需要一个指针,因此必须在 lambda 内部使用 局部变量 VBO。它的值 returned 用于初始化 成员变量。 VBO。当然,我可以给本地变量。另一个名字…

Live Demo on coliru