mainの前に関数を呼び出す方法 VCの場合

Cでmainの前に関数を呼び出す

セクション.CRT$XIUに関数ポインタを置く。これは自分で書く。

CRTはCRT$XIAとCRT$XZに__xi_a,__xi_zを置く。
セクションはリンク時にまとめてアルファベット順に並べられるので、__xi_aと__xi_zに挟まれた領域にある関数ポインタを全部呼び出すことでコンストラクタを呼び出す。

C++でグローバルなインスタンスのコンストラクタコール

グローバルインスタンスのコンストラクタを誰が呼ぶか?
Visual C++コンパイラはコンストラクタのポインタをセクションのCRT$XCUに置く。

CRTはCRT$XCAとCRT$XCZに__xc_a,__cx_zを置く。

mainの後に実行するもの

C++のグローバルインスタンスのデストラクタはおそらくatexitの機能と同様に呼ばれる。グローバルな場合はインスタンスが置かれてる順番で登録されるが複数ファイルにまたがるときの順番は不明。staticの場合はコンストラクタが実行された後のタイミングで登録される。

上で示したセグメントでやる呼ぶ方法もあるが同じなのでスルー

https://msdn.microsoft.com/ja-jp/library/bb918180.aspx
http://www.codeguru.com/cpp/misc/misc/applicationcontrol/article.php/c6945/Running-Code-Before-and-After-Main.htm#page-1

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)