#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. еще одно имя…
Комментарии:
1. Вы хотите сказать, что я не могу использовать вызов функций вне функций? Вы знаете, что я исхожу из фона питона, и это звучит немного неловко для меня…
2. @Люк__ Вы вряд ли сможете применить знания из Python к C . Это разные языки. Да, это разрешено в Python, и нет, это запрещено в C . (И, кстати, это. не единственная разница между этими двумя языками.) 😉
3. Я понимаю! Большое вам спасибо за ваше время и усилия, потраченные на то, чтобы ответить мне! Хорошего дня!