グローバルスコープの初期化の順序

アバター
いわん
記事: 32
登録日時: 9年前

グローバルスコープの初期化の順序

投稿記事 by いわん » 9年前

ライブラリにあるオブジェクトを参照するクラスオブジェクトをグローバルスコープに配置すると(初期化の順序によって)問題が発生することが判明。
最初は原因もよくわからず悩んだけど VC++ には #pragma init_seg(lib) でライブラリのオブジェクトを先に初期化できる仕掛けがあることがわかりなんとか解決。
オブジェクトをグローバルスコープに配置できなくする方法があればそれでもよかったんだけど、そんな方法はないかな。

YuO
記事: 947
登録日時: 14年前

Re: グローバルスコープの初期化の順序

投稿記事 by YuO » 9年前

掲示板向きの話題ですが……。

グローバルオブジェクトの初期化順序は未規定なので,グローバル関数のstatic変数として定義する,という逃げ方があります。
最初に関数が呼ばれたときに初期化されるので,循環さえしなければ依存するオブジェクトは常に構築されている,という条件を作れます。

アバター
いわん
記事: 32
登録日時: 9年前

Re: グローバルスコープの初期化の順序

投稿記事 by いわん » 9年前

そういうやり方で回避する方法もあるんですね。
ライブラリ使用者が初期化の問題を意識することなく利用できるように、使用方法に影響なく解決する方法で悩んでました。
コンパイル時に警告等が出るような仕掛けでもよかったんですが、これは難しそう。
namespasとか利用できないかな・・・ かえって面倒になるかな。