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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам