C++11 ドラフトから:
メインの最初のステートメントの前に、静的記憶域期間を持つ非ローカル変数の動的初期化が行われるかどうかは、実装によって定義されます。初期化が main の最初のステートメントの後のある時点まで延期される場合、初期化される変数と同じ変換単位で定義された関数または変数の最初の odr-use (3.2) の前に発生するものとします。[鉱山を強調]
つまり、同じ翻訳単位で定義されたものを使用する前に、静的変数を初期化する必要があります。
dlopen
動的ライブラリ(DLLまたはSO)を遅延して、または動的に(呼び出しなどで)ロードおよび初期化できるようにするために、この方法が行われているように見えますLoadLibrary
。DLL 自体が読み込まれる前に、DLL で定義された変数を初期化できないことは明らかです。
当然のことながら、C++ は DLL について何も知らないため、標準では直接言及されていません。しかし、委員会の人々は実際の環境とコンパイラについて知っており、DLL についても確かに知っています。この句がないと、DLL の遅延読み込みは技術的に C++ 仕様に違反します。(実装者がそれを行うのを妨げるというわけではありませんが、私たち全員がお互いに協力しようとする方が良いです。)
そして、どのシステムがこれをサポートしているかについては、少なくとも MS Visual C++ コンパイラは遅延動的リンクをサポートしています (DLL は最初に使用するまでロードされません)。また、最新のプラットフォームのほとんどは、DLL の動的ロードをサポートしています。