2012-04-18 11 views
1

重要なオブジェクトの初期化を確実にするために、関数が最初に呼び出されるようにしようとしています。しかし、私はどのようにinit_segが使用されている/呼び出されていると思われるのか混乱しています。init_segを使用して初期化関数を呼び出す

たとえば、msdnのドキュメントから、次のものが最初に呼び出されるように見えます。

#pragma init_seg(".CRT$XCC") 

static void InitializeStuff() 
{ 
    printf("InitializeStuff\n"); 
} 

しかし、その関数は明示的には自動的に呼び出されません(もちろん明示的に呼び出さない限り)。

他の実行コードの前に関数が呼び出されるようにするには、どうすればinit_setを使用できますか?

+0

'main()'の前に呼び出されますか?それだけでいいの? – Nawaz

+0

私はそれが私のアプリケーションのために呼び出される最初のものであることを確認したいと思います。私はこれをボス・ペルソンの答えとの質問http://stackoverflow.com/questions/10198675/compiler-specific-memory-initializationから今日早くに提案しました。 – chadb

+0

関数名を使用する['init_seg'](https://msdn.microsoft.com/en-us/library/7977wcck.aspx)の4番目の(?)バージョンを使用する必要があると思います:' #pragma init_seg ( ".CRT $ XCU"、 "InitializeStuff") 'となります。 – jww

答えて

1

私はあなたが#pragma init_seg

例と同じファイルで最初に初期化したいすべてのグローバル変数に置く右のそれを理解している場合:

#pragma init_seg(".CRT$XCB") 

class A 
{ 
    A() 
    { 
     printf("first!\n"); 
    } 
}; 

static A first; 

そして、あなたは他を置いていけないことを確認します最初に初期化したいものよりもそのファイル内のグローバルなものです。

+0

あなたの例はクラスの使用を示していますが、私は私の記事で述べたように関数でこれを行うことを望んでいました。あなたがクラスを実演した特別な理由はありますか?それはクラスでなければならないのですか?関数ではできませんか?そうでなければ、どうしてですか? – chadb

+0

プラグマディレクティブはそうでない場合、静的オブジェクトまたはグローバルオブジェクトの作成順序はソートされていない/未知であるため、ソート順のみをソートします。あなたのプログラムで最初に関数を呼びたいのであれば、それを最初に呼び出すのはなぜですか? – David

+0

実際にinit_seg指示文を使用して、私があなたに勧めないようにしたい場合は、クラスを作成し、そのコンストラクタですべての初期化コードを実行することができます( "printf(" first!\ n ");"をあなたのコードに置き換えてください) ... – David

関連する問題