そこで、ANTLR を使用して構文コンパイラを構築しています。生成されたコードの一部は次のようになります。
const int ExampleClass::EXAMPLEVAR = OtherExample::OTHEREXAMPLEVAR;
ご覧のとおり、これは「静的初期化順序の大失敗」の説明に適合します。
問題は、このプロジェクトの目標の 1 つは、生成された C++ コードを、さらなる構文コンパイルのベースとしてできるだけ簡単に使用できることです。
そのため、この場合、「最初の使用時に構築する」パラダイムが問題になる可能性があります。静的変数と静的関数を区別するのははるかに困難です。
これらの静的変数が単一のコンパイル単位で初期化されている場合、問題は存在しないことを何度か読んだことがあります。
したがって、これらの競合する状況をすべて、依存関係順に並べた別の .cpp ファイルに移動するという考えがあります。
これらの競合する状況に対して生成されたコードは、次のようになります。
//StaticInitializations.cpp
#include "ExampleClass.h"
#include "OtherExample.h"
const int OtherExample::OTHEREXAMPLEVAR = 3;
const int ExampleClass::CHANNEL_TYPE_TV = OtherExample::OTHEREXAMPLEVAR;
私の質問は次のとおりです。