2013-03-15 3 views
2

Так я строю синтаксис компилятор с 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; 

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

+6

Есть тег '[static-order-fiasco]'? Вау. – NPE

+0

Почему бы не работать? Должно. – Pubby

+0

Технический вопрос: Да, в одном блоке компиляции все объекты инициализируются в том порядке, в котором они появляются. Другой вопрос: сможете ли вы сохранить это? –

ответ

7

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

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

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

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

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

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

+0

Да, ты прав. Мои коллеги говорят мне то же самое. Однако я предполагаю, что эти инициализации являются архитектурной проблемой. Поэтому я также генерирую предупреждение, так что эти конструкции могут быть заменены. Я думаю, что этот подход все же может быть релевантным как промежуточное решение, поэтому у команды достаточно времени, чтобы исправить эти проблемы постепенно. Благодарим за отзыв, хотя это актуальная проблема;) Но, как я сказал в вопросе: было бы сложнее использовать сгенерированный код в качестве базы для дальнейшей синтаксической компиляции. –

+0

Знаешь что? Вероятно, это лучший ответ. Я могу по-прежнему работать с частью не-легко идентифицируемой-как-статической-var, аннотируя функцию константой #define. Спасибо;) Я принимаю этот ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^