【问题标题】:Can't use glGenBuffers in .h file C++不能在 .h 文件 C++ 中使用 glGenBuffers
【发布时间】:2021-11-06 00:24:17
【问题描述】:

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

#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) 向我指出一个错误,上面写着“此声明不包括存储类或类型标识符”(参考glGenBuffer 函数;我的编辑器设置为意大利语,因此我的翻译可能不会完美)。我还尝试在这个命名空间中添加一个类(即使在我的开始计划中我想避免这种方法):

#include <...>

namespace data {


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

    };
    

}

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

【问题讨论】:

    标签: c++ opengl namespaces header-files glad


    【解决方案1】:

    来自 OP 的片段:

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

    这是一个语法错误。 glGenBuffers(1, &amp;VBO) 是函数体块范围之外的函数调用。你必须移动它,例如进入class Data的构造函数。充其量,您可以将其放入一个 lambda 中,用作 Data::VBO 的初始化器:

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

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

    Live Demo on coliru

    【讨论】:

    • 你是说我不能在函数外使用函数调用?你知道我来自 python 背景,这对我来说听起来有点尴尬......
    • @Luke__ 你几乎无法将 Python 中的知识应用到 C++ 中。这些是不同的语言。是的,它在 Python 中是允许的,不,它在 C++ 中是不允许的。 (而且,这是顺便说一句。不是两种语言之间的唯一区别。);-)
    • 我明白了!非常感谢您花时间和精力回答我!祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2015-03-30
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多