あなたが言うように、順序は異なるコンパイル単位間で定義されていません。
同じコンパイル単位内では、順序が明確に定義されています。つまり、定義と同じ順序です。
これは、これが言語レベルではなく、リンカ レベルで解決されるためです。そのため、リンカーのドキュメントを確認する必要があります。これが何らかの有用な方法で役立つとは思えませんが。
gcc の場合: ldを確認してください
リンクされているオブジェクト ファイルの順序を変更しても、初期化の順序が変わる可能性があることがわかりました。したがって、心配する必要があるのはリンカーだけではなく、ビルド システムによってリンカーが呼び出される方法です。問題を解決しようとしても、実際には初心者ではありません。
これは通常、独自の初期化中に相互に参照するグローバルを初期化する場合にのみ問題になります (そのため、コンストラクタを持つオブジェクトにのみ影響します)。
問題を回避するためのテクニックがあります。
- 注 1: グローバル:
の前に初期化される可能性がある静的ストレージ期間変数を参照するために大まかに使用されますmain()
。
- 注 2:
一般的なケースでは、メインの前に静的ストレージ期間変数が初期化されることが期待されますが、コンパイラは状況によっては初期化を延期することができます (ルールは複雑で、詳細については標準を参照してください)。