Поэтому я создаю синтаксический компилятор с ANTLR, и часть сгенерированного кода выглядит следующим образом:
const int ExampleClass::EXAMPLEVAR = OtherExample::OTHEREXAMPLEVAR;
Как видите, это соответствует описанию «фиаско статического порядка инициализации».
Проблема заключается в том, что одна из целей этого проекта заключается в том, чтобы сгенерированный код C ++ можно было использовать в качестве основы для дальнейшей компиляции синтаксиса.
Вот почему парадигма «конструирование при первом использовании» может быть проблемой в этом случае: было бы намного сложнее отличить статическую переменную от статической функции.
Теперь я прочитал несколько раз, что проблема не существует, если эти статические переменные инициализируются в одном модуле компиляции.
Поэтому у меня есть идея перенести все эти конфликтующие ситуации в отдельный файл .cpp, упорядоченный по их зависимостям.
Сгенерированный код для этих конфликтных ситуаций будет выглядеть так:
//StaticInitializations.cpp
#include "ExampleClass.h"#include "OtherExample.h"const int OtherExample::OTHEREXAMPLEVAR = 3;
const int ExampleClass::CHANNEL_TYPE_TV = OtherExample::OTHEREXAMPLEVAR;
Мой вопрос: будет ли это работать?
Поэтому у меня есть идея перенести все эти конфликтующие ситуации в отдельный файл .cpp, упорядоченный по их зависимостям.
Это будет файл, который вам нужно обновить для кода в других частях, и зависимость в вашем коде, которую вы должны отслеживать и обновлять вручную (в основном источник ошибок).
Не делай этого.
Порядок статических инициализаций можно изменить, используя вместо этого статические функции:
/* static */
int ExampleClass::EXAMPLEVAR()
{
static const int value = OtherExample::OTHEREXAMPLEVAR();
return value;
}
Это гарантирует, что значения будут возвращены / инициализированы с учетом зависимостей порядка инициализации.
Других решений пока нет …