私はinit_seg
を使用して、3つのC++クラスオブジェクトの作成を制御しています。各オブジェクトは異なるソースファイル/翻訳単位にあります。デバッグでは、CRTの初期化中にオブジェクトが期待どおりに作成されていることが示されます。init_segを使用している場合、3つのC++オブジェクトのセクション/グループに名前を付けるにはどうすればいいですか?
オブジェクトは、ソースファイルのアルファベット順に初期化されています。私はそれが正しくないので、それを変更したいと思います。私はinit_seg
にMSDNのページを訪問し、それが使用することを述べている:
#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]})
それはlib
の使用を表示され、section-name
はinit_seg(lib)
を使用して、セクション/グループ名を提供するためにどのように私にはとてもその明確ではない、相互に排他的ですアルファベット順の順序を取得する。
私は順序を制御するためにアルファベット順に文字列を使用しようとすると:
#pragma init_seg(lib, "01")
それは私が推測しています警告、その結果は、物事が期待どおりに動作するつもりはありません意味:
warning C4081: expected ')'; found ','
".CRT$XCB"
,".CRT$001"
、".CRT$XCB001"
(アルファベット順を使用する他の変形例)を使用して直接CRTスタートアップコードに直接挿入しようとすると、
warning C4075: initializers put in unrecognized initialization area
:それは私が推測しています別の警告、その結果
#pragma init_seg(".CRT$XCB")
は、物事が期待どおりに動作するつもりはありません意味します複数の翻訳単位。私はまた、KB104248のアーカイブをWayback Machine上に見つけましたが、compiler
,lib
およびuser
の使用しか示されていないため、あまり役に立ちません。
私の質問は、init_seg
を使って、3つの異なるソースファイルで3つのオブジェクトの正確な作成順序を制御するにはどうすればいいですか?
MSDNのサンプルコードを見ましたか?そのコードに基づいて、あなたが求めていることをどうやってやるのか、合理的な推測をすることはできますが、個人的な経験に基づいて答えを探しているように聞こえるでしょうか? –
ありがとうハリー。どのサンプルコードを参考にしていますか? ['init_priority'](https://msdn.microsoft.com/en-us/library/7977wcck.aspx)ページで提供されているコードを見ましたが、私は' mine $ a'と '.mine $ z'、割り当て、そしてスタートアップコードを置き換えます。標準的なCRTの起動が適切と思われます。私は3つのオブジェクトを特定の順序で挿入する必要があります。 – jww
ドキュメントを正しく読んでいる場合、名前付きセクションを使用すると、CRTは静的オブジェクトを初期化または破棄しないため、コンストラクタとデストラクタを明示的に呼び出す必要があります。その上に、注文を管理することができます。このサンプルコードは、コンパイラ内部の知識を使用して、名前付きセクションにあるオブジェクトのコンストラクタを呼び出すように見えますが、それはあなたのケースでは不要な複雑さだと思います。オブジェクトが何であるかを知っているので、名前で。 –