Инициализация статических переменных в функции, а не в начале файла

#c #opengl #static

#c #opengl #статические

Вопрос:

Я довольно новичок в C и наткнулся на следующую проблему: у меня есть структура со всеми статическими элементами, которая загружает модели в VAOs и VBO (OpenGL). Я хочу создать постоянный статический объект, который хранит информацию, необходимую для отображения VAO (Примечание: константа здесь не проблема). Проблема здесь в том, что мне приходится ждать создания контекста OpenGL и я могу вызвать функцию загрузки только после этого (моей идеей была init() функция), но все статические переменные должны быть объявлены напрямую! (Я также пытался создать struct с нестатическими членами и просто создать статический экземпляр этой struct, но модель все еще должна быть определена в конструкторе). Любая помощь была бы отличной!

РЕДАКТИРОВАТЬ: Я также понял, что C , вероятно, хочет вообще избежать этого, поэтому мне не следует пытаться найти лазейку. Я просто ищу решение, которое также могло бы включать полную реструктуризацию того, что я сделал до сих пор.

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

1. Проблема не в const объявлении, я удалил этот модификатор, но он по-прежнему не работает. Для меня на самом деле не имеет значения, является ли это константой или нет. Но спасибо за ссылку, очень интересно.

Ответ №1:

У вас есть несколько способов сделать

  • иметь не статическую структуру, а статический указатель на структуру и выделять ее, когда у вас есть контекст для ее инициализации (S1 * G1 в моем примере ниже)
  • обновлять структуру, когда у вас есть контекст для этого (S2 G2 в примере ниже)

Пример :

 #include <iostream>

struct S1 {
  S1(int v) : _v(v) {}
  int _v;
};

struct S2 {
  int _v;

  void set(int v) { _v = v; }
};

const S1 * G1;
S2 G2;

int main()
{
  int v;

  std::cin >> v;

  // now we are able to set the structs

  G1 = new S1(v);
  G2.set(v); // note G2._c is public and can be set directly too

  // etc
}
  

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

1. Это действительно хорошо, но я создаю этот статический указатель в отдельном методе, отличном от метода визуализации, что означало бы, что данные, которые я удалил в конце init() , правы?

2. Это сработало! Хотя я думал Constants* pointer = new Constants(); удалить объект Constants, на который он указывает, в конце метода. Я ошибаюсь?

3. @J.Lengel Я не уверен, что понимаю вас. Вы можете смешать два решения, имеющие S * G; и где-то G = new S; и где-то после G->init(); , чтобы инициализировать некоторые элементы, которые еще не были инициализированы при его создании

4. приведет к удалению объекта Constants, на который он указывает в конце метода. почему? в форме Constants* pointer = new Constants(); деструктор не вызывается

5. Спасибо! это именно то, что мне было интересно. Полезно знать!