Не удается использовать glGenBuffers в файле .h C

#c #opengl #namespaces #header-files #glad

Вопрос:

Я пытаюсь выучить OpenGL на C . Чтобы очистить свой код, я пытался создать файл заголовка со всеми переменными, которые описывают объекты в нем. Этот заголовок выглядит примерно так:

 #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[] = {...}

    ...

}
 

Я хотел бы добавить в это пространство имен также VAOs и VBO, но как только я попытаюсь реализовать их с помощью glGenBuffers и glGenVertexArray :

 unsigned int VBO;
glGenBuffers(1, amp;VBO);
 

среда разработки (Visual Studio) указывает мне на ошибку, в которой говорится: «это объявление не включает идентификатор класса хранения или типа» (относится к glGenBuffer функции; мой редактор настроен на итальянский, поэтому мой перевод может быть неверным). Я также попытался добавить класс внутри этого имени (даже если в своих начальных планах я хотел избежать этого подхода):

 #include <...>

namespace data {


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

    };
    

}
 

На этот раз ошибка, которую я получаю, гласит: «Отсутствует явный тип. Он будет использоваться int» (относится к glGenBuffers функции; содержит то, что я писал ранее: перевод может быть не идеальным, но я думаю, что он понятен).
В качестве последней попытки я также попытался реализовать пространство имен в main.cpp файле в рамках main функции. Ошибка, которую я получаю, такая же, как и первая, но если я использую эти вызовы функций внутри main, они работают. Я также уже написал некоторые другие классы, такие как shader.h или camera.h следуя этому руководству, и там я смог (используя необходимые компоненты, такие как glad/glad.h ) использовать gl* такие функции glCreateShader , как glCreateProgram , glAttachShader и так далее.

Ответ №1:

Фрагмент из OP:

 namespace data {


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

    };

}
 

Это синтаксическая ошибка. glGenBuffers(1, amp;VBO) является вызовом функции за пределами области блока тела функции. Вы должны переместить его, например, в конструктор class Data . В лучшем случае вы могли бы поместить его в лямбду, которая используется в качестве инициализатора Data::VBO :

 namespace data {


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

    };
    

}
 

Выглядит немного запутанно? Как glGenBuffers() и ожидает указатель, локальная переменная VBO должна использоваться внутри лямбды. Это значение используется return для инициализации элемента var. VBO Конечно, я мог бы дать местному var. еще одно имя…

Живая демонстрация на coliru

Комментарии:

1. Вы хотите сказать, что я не могу использовать вызов функций вне функций? Вы знаете, что я исхожу из фона питона, и это звучит немного неловко для меня…

2. @Люк__ Вы вряд ли сможете применить знания из Python к C . Это разные языки. Да, это разрешено в Python, и нет, это запрещено в C . (И, кстати, это. не единственная разница между этими двумя языками.) 😉

3. Я понимаю! Большое вам спасибо за ваше время и усилия, потраченные на то, чтобы ответить мне! Хорошего дня!