2011-01-10 3 views
12

msvc8にテストした後、私が見つかりました:main()より前に実行されるのは何ですか?

  1. 解析GetCommandLine()は、これらの三つのことが呼ばれ

グローバル変数の

  • 標準Cライブラリの初期化
  • C++コンストラクタのargcとargvしますmain()に入る前に

    私の質問は以下のとおりです。私は別のコンパイラ(gccのかのarmcc)、または別のプラットフォームへの私のプログラムを移植するとき

    1. は、この実行順序が違うのでしょうか?
    2. 標準Cライブラリの初期化はどのような作業を行いますか?これまで私はsetlocale()が必須であることを知っています。
    3. グローバル変数のC++コンストラクタ内で標準C関数を呼び出すことは安全ですか?
  • +0

    何をしようとしていますか?ライブラリの初期化はまた、いくつかの機能(例えば、iostream用のバッファ)用にいくつかのバッファを作成します。リストする余分なタスクが多すぎます。 –

    +0

    注文はなぜ問題でしょうか? – SmallChess

    +0

    メインの前には何が実行されますか?それが追いかけているものは何でも。 –

    答えて

    5

    1:私は別のコンパイラ(gccのかのarmcc)、または別のプラットフォームへの私のプログラムを移植するとき、この実行順序が違うのでしょうか?

    はい。

    2:スタンダードCライブラリの初期化は何をしますか?これまで私はsetlocale()が必須であることを知っています。

    他にもあると思います。 mainを起動した後は、グローバルオブジェクトutilに頼るべきではありません。つまり、stdストリーム(std :: cin、std :: cout)のようなものは使えないかもしれません。

    3:グローバル変数のC++コンストラクタ内で標準C関数を呼び出しても安全ですか?

    おそらくそうではありません。

    +1

    @ephemient:恐らく安全です。しかし、おそらく良い考えではないでしょう。これらのストリームはロケールを別のグローバル変数として使用しますが、その値は現在のロケールまたは "C"である場合とそうでない場合があります。不特定の順序は本当の問題ではありません(あなたが存在することを知っているならば、それは回避できます(それが問題である、それが存在することを知っています)))。 –

    4

    LSB(Linux Standard Base)のarticleは、Linuxで何をする可能性があるのか​​を説明しています。具体的に

    * performing any necessary security checks if the effective user 
        ID is not the same as the real user ID. 
    * initialize the threading subsystem. 
    * registering the rtld_fini to release resources when this dynamic 
        shared object exits (or is unloaded). 
    * registering the fini handler to run at program exit. 
    * calling the initializer function (*init)(). 
    * calling main() with appropriate arguments. 
    * calling exit() with the return value from main(). 
    

    そして、ここではmore detailed explanationです。

    これはWindowsとはまったく異なります。

    +0

    それでは、C++ランタイムライブラリが何をしているのかは分かりません。 – ephemient

    +1

    C++のランタイムライブラリの実装を見てみることなく、C++のユーザーが自分の頭を痛めている... –

    関連する問題