2

そこで、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;

私の質問は次のとおりです。

4

1 に答える 1

7

したがって、これらの競合するすべての状況を、依存関係順に並べられた別の .cpp ファイルに移動するという考えがあります。

それは、他の部分のコードのために更新する必要があるファイルであり、手動で追跡して最新の状態に保つ必要があるコードの依存関係です (基本的にバグの原因)。

そうしないでください。

代わりに静的関数を使用して、静的初期化の順序を強制できます。

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

これにより、初期化順序の依存関係を考慮して、値が返される/初期化されることが保証されます。

于 2013-03-15T09:01:57.453 に答える