2012-12-04 21 views
10

में बनाए जाते हैं, तो मुझे पता है कि वैश्विक चर सभी संकलन इकाई के लिए घोषणा क्रम में बनाए जाते हैं और निर्माण संकलन एकाधिक संकलन इकाइयों के बीच परिभाषित नहीं किया जाता है।जब स्थिर वैश्विक चर C++

मैंने कुछ समय पहले पढ़ा है कि संकलन इकाई से किसी भी कोड से पहले वैश्विक चर बनाए जाते हैं जहां उन्हें परिभाषित किया जाता है। क्या यह मानक द्वारा परिभाषित किया गया है?

उदाहरण:

file1.cpp

int f1v1 = f1_1(); 
int f1v2 = f1_2(); 

void f1(){...} 

int f1_1(){...} 
int f1_2(){...} 

file2.cpp

static int f2v1 = f2_1(); 
static int f2v2 = f2_2(); 

int f2_1(){...} 
int f2_2(){...} 

main.cpp

#include "file1.h" 
#include "file2.h" 

int main() 
{ 
    f1(); 

    return 0; 
} 

इस मामले मानक की गारंटी में है कि f1_1()f1_2() से पहले और f1() से पहले कहा जाता है? मानक द्वारा गारंटी दी जाती है कि f2_1() और f2_2() सभी को फ़ाइल 2.cpp में परिभाषित कोई फ़ंक्शन नहीं कहा जाता है और f2v1 और f2v2 फ़ाइल 2.cpp के बाहर दिखाई नहीं दे रहे हैं?

संपादित करें:

व्यवहार मानक द्वारा निर्दिष्ट जब file1.cpp lib1 में संकलित किया गया है और file2.cpp lib2 में संकलित किया गया है है?

+0

आपको यह http://stackoverflow.com/questions/12321401/ मिल सकता है गतिशील-प्रारंभिक उपयोगी – hmjd

+0

नोट: चाहे 'स्थिर' या केवल चर के * लिंक * को प्रभावित करता है, इसकी प्रारंभिक समान है। –

+0

@MatthieuM। मैं इसे स्पष्ट करना चाहता था कि चर का उपयोग नहीं किया जाता है (अन्य स्थान से एक्सेस किया गया) – Felics

उत्तर

4

[basic.start.init] के आधार पर: "का आदेश दिया एक भी अनुवाद इकाई के भीतर परिभाषित आरंभीकरण के साथ चर उनकी परिभाषा के क्रम में प्रारंभ की जाएगी:

f1_1() से पहले f1_2() (para.2 निष्पादित करने के लिए गारंटी है अनुवाद इकाई में। ")।

दोनों को f1() (पैरा 4:) से पहले निष्पादित करने की गारंटी है: "अगर प्रारंभिक मुख्य के पहले कथन के बाद कुछ बिंदु पर स्थगित कर दिया गया है, तो यह किसी भी फ़ंक्शन के पहले odr-use (3.2) से पहले होगा या वैरिएबल को वैरिएबल के रूप में परिभाषित करने के लिए वैरिएबल के रूप में परिभाषित किया गया है। ")।

बारे f2_1() और f2_2(), [basic.stc.static] para.2 "स्थैतिक भंडारण अवधि के साथ एक चर प्रारंभ या साइड इफेक्ट के साथ एक नाशक है, यह भले ही यह अप्रयुक्त हो गया लगता है समाप्त किया जा नहीं होगा कहते हैं, ... "। इसका मतलब यह होगा कि अगर उन्हें दुष्प्रभाव होते हैं तो उन्हें बुलाया जाने की गारंटी है।

0

यदि मैं आपके प्रश्न को सही समझ रहा हूं, तो सी ++ एक संकलन इकाई (यानी एक सीपीपी फ़ाइल) के भीतर घोषणा घोषणा के अनुसार वैरिएबल के प्रारंभिक क्रम की गारंटी देता है। संकलन इकाइयों में प्रारंभिकरण का क्रम अनिर्धारित है।

संकलन की प्रक्रिया में, f2_* कार्यों मानक के अनुसार कहा जा सकता है, भले ही file2.cpp में कार्य भाग गया नहीं कर रहे हैं। लेकिन यदि संकलक पर्याप्त स्मार्ट है, तो यह पूरी तरह से उन्हें छोड़ सकता है अगर यह निर्धारित करता है कि परिणामी प्रोग्राम पर कार्य करेगा जैसे कि यह मानक के साथ पालन करता था। (अर्थात।यदि यह संदेह की छाया से परे गारंटी दे सकता है कि किसी प्रोग्राम के बीच व्यवहार में कोई अंतर नहीं होगा और इन कार्यों के बिना एक कार्यक्रम कहा जा रहा है)

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