2011-01-10 9 views
12

msvc8 पर परीक्षण के बाद, मैंने पाया:मुख्य() से पहले क्या चलता है?

  1. पार्स GetCommandLine() वैश्विक चर

ये तीन बातें कहा जाता है की argc और argv करने के लिए

  • स्टैंडर्ड सी लाइब्रेरी प्रारंभ
  • सी ++ निर्माता मुख्य प्रवेश करने से पहले()।

    मेरे प्रश्न हैं:

    1. इस निष्पादन आदेश जब मैं अलग संकलक (जीसीसी या armcc), या अलग अलग मंच करने के लिए अपने कार्यक्रम पोर्टिंग अलग हो जाएगा?
    2. मानक सी लाइब्रेरी प्रारंभिकता क्या करती है? अब तक मुझे पता है कि Setlocale() एक जरूरी है।
    3. क्या वैश्विक चर के सी ++ कन्स्ट्रक्टर के अंदर मानक सी कार्यों को कॉल करना सुरक्षित है?
  • +0

    आप क्या करने की कोशिश कर रहे हैं? लाइब्रेरी प्रारंभिक कुछ कार्यों के लिए कुछ बफर भी बनाते हैं (उदाहरण के लिए iostream के लिए बफर)। सूची में बहुत सारे विविध कार्य हैं। –

    +0

    आदेश क्यों मायने रखेंगे? – SmallChess

    +0

    मुख्य से पहले क्या चलता है? जो कुछ भी पीछा कर रहा है। –

    उत्तर

    5

    1: जब मैं अलग संकलक (जीसीसी या armcc), या अलग अलग मंच करने के लिए अपने कार्यक्रम पोर्टिंग इस निष्पादन के क्रम अलग हो जाएगा?

    हां।

    2: मानक सी लाइब्रेरी प्रारंभिकता क्या करती है? अब तक मुझे पता है कि Setlocale() एक जरूरी है।

    मुझे यकीन है कि अन्य सामान भी हैं। मुख्य शुरू होने के बाद आपको किसी वैश्विक वस्तु पर भरोसा नहीं करना चाहिए। इसका मतलब है कि स्टडी स्ट्रीम (std :: cin, std :: cout) जैसी चीजें उपयोग योग्य नहीं हो सकती हैं।

    3: क्या वैश्विक चर के सी ++ कन्स्ट्रक्टर के अंदर मानक सी कार्यों को कॉल करना सुरक्षित है?

    शायद नहीं।

    +1

    @ephemient: शायद सुरक्षित। लेकिन शायद एक अच्छा विचार नहीं है। ये धारा लोकेल का उपयोग एक और वैश्विक चर का उपयोग करती हैं लेकिन इसका मूल्य वर्तमान लोकेल या "सी" हो सकता है या नहीं। अनिर्दिष्ट आदेश वास्तविक समस्या नहीं है (यदि आपको पता है कि यह अस्तित्व में है (यह सिर्फ एक परेशानी है जिसे आसपास काम किया जा सकता है (यह एक समस्या है यदि आप नहीं जानते कि यह मौजूद है))। –

    4

    एलएसबी (लिनक्स मानक आधार) प्रयास से article का वर्णन __libc_start_main लिनक्स पर क्या कर सकता है इसका वर्णन करता है।

    विशेष रूप से:

    * 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 है।

    यह विंडोज के लिए निश्चित रूप से अलग है।

    +0

    और यह भी C++ रनटाइम लाइब्रेरी में क्या नहीं हो रहा है! – ephemient

    +1

    सी ++ उपयोगकर्ता होने के नाते सी ++ रनटाइम लाइब्रेरी के कार्यान्वयन को देखने के बिना, मेरे सिर को पर्याप्त दर्द होता है ... –

    संबंधित मुद्दे