静的変数値に依存するコードを書きたいと思います。したがって、他の静的変数コンストラクターからこのコードを呼び出す可能性を排除するために、いくつかのチェックを追加したいと考えています。そして、静的な初期化順序の大失敗を一度だけ防ぎます。例えば:
static Foo foo = Foo();
// this function should be called ONLY from main program conrol flow
// ONLY after all static variable initialization was complete! ONLY!
int bar()
{
#ifdef _DEBUG
if(! CRT_was_initialized_and_main_function_was_called ) ShowErrorMessage();
#endif
if(foo.somefunction() == 2) return 0; else return -1;
}
//here inattentive programmer will caught error message during debug
const int barConstant = bar();
int main()
{
//now all is fine
const int barConstant = bar();
}
どうすればそうできますか?メイン関数が呼び出された後に関数が呼び出されたかどうかを確認する方法は?
更新: Foo オブジェクトには非常に重い初期化コードがあり、遅くなる可能性があり、例外をスローすることさえあります
更新 2: そうする生命の懸念はありません。ほとんどの場合、バー機能の前のコメントは正常に機能しました。これを手動で行うのではなく、プログラムのデバッグバージョンで不注意なプログラマーを罰するためのある種のデバッグチェックに興味があります。また、MSVC でのみ機能するクレイジーな組み込み関数の呼び出しのような非標準的な方法である可能性もあります。