Так я строю синтаксис компилятор с 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;
Мой вопрос: Будет ли это работать?
Есть тег '[static-order-fiasco]'? Вау. – NPE
Почему бы не работать? Должно. – Pubby
Технический вопрос: Да, в одном блоке компиляции все объекты инициализируются в том порядке, в котором они появляются. Другой вопрос: сможете ли вы сохранить это? –