Статический порядок инициализации фиаско: тот же модуль компиляции?

Поэтому я создаю синтаксический компилятор с 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;

Мой вопрос: будет ли это работать?

2

Решение

Поэтому у меня есть идея перенести все эти конфликтующие ситуации в отдельный файл .cpp, упорядоченный по их зависимостям.

Это будет файл, который вам нужно обновить для кода в других частях, и зависимость в вашем коде, которую вы должны отслеживать и обновлять вручную (в основном источник ошибок).

Не делай этого.

Порядок статических инициализаций можно изменить, используя вместо этого статические функции:

/* static */
int ExampleClass::EXAMPLEVAR()
{
static const int value = OtherExample::OTHEREXAMPLEVAR();
return value;
}

Это гарантирует, что значения будут возвращены / инициализированы с учетом зависимостей порядка инициализации.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]