बनाम एक स्थिर सदस्य चर जो की एक स्थिर सदस्य चर अन्य वर्ग से आरंभ नहीं हो जाता यह देखते हुए के साथ स्थिर सदस्य चर निर्भर आरंभीकरण पर स्थिर, गैर शाब्दिक struct ii
कभी कभी करने के लिए 0
या के लिए शुरू डिफ़ॉल्ट है 333
। यह संकलन या लिंकिंग ऑर्डर पर निर्भर करता है। स्यूडोकोड प्रदर्शित करने के लिए:सी ++: पूर्णांक struct
class StaticClass: // file 'ONE.cpp/.hpp'
static int i = 2
static struct ii { int a = 333 }
class ABC: // file 'abc.cpp'
static int abc_i = StaticClass::i // always 2
static struct abc_ii = StaticClass::ii // sometimes 0, sometimes 333
कॉलिंग i = 2/ii = 0
में g++ -std=c++11 abc.cpp ONE.cpp && ./a.out
परिणाम (जीसीसी 4.8.1, ++ बजना के साथ 3.7 एक ही; -Wall -Wextra
कभी नहीं शिकायत)।
लेकिन g++ -std=c++11 ONE.cpp abc.cpp && ./a.out
पर कॉलिंग i = 2/ii = 333
में परिणाम!
ONE.o abc.o
बनाम abc.o ONE.o
और यह भी साथ एक ही होता है जब फ़ाइलों श्रृंखलाबद्ध एक तरह से या किसी अन्य रूप: करने के लिए डिफ़ॉल्ट प्रारंभ
cat ONE.cpp abc.cpp > X.cpp && g++ X.cpp && ./a.out
बनाम cat abc.cpp ONE.cpp > Y.cpp && g++ Y.cpp && ./a.out
निकाला जा रहा है भी शामिल है और एकल फाइल में चारों ओर कोड का स्थान बदलना, 0 तब होता है जब यह ऑर्डर मौजूद होता है:
const OneI ABC::def_ii = StaticClass::ii; const OneI StaticClass::ii = OneI{333};
और इस आदेश के साथ 333 से है:
const OneI StaticClass::ii = OneI{333}; const OneI ABC::def_ii = StaticClass::ii;
क्यों भी दो अलग-अलग संकलन इकाइयों के साथ होता है? क्या इसे हर समय बाद के आदेश को लागू करके किसी भी तरह से बचा जा सकता है? ABC
में StaticClass::ii
सुरक्षित (हालांकि मैं नहीं करना चाहूंगा) में स्थिर सूचक का उपयोग कर रहा हूं?
पूर्ण सी ++ कोड:
/* File: abc.cpp */
#include <iostream>
#include "ONE.hpp"
struct ABC {
ABC();
static const int def_i;
static const OneI def_ii;
void arg_i(const int &x) { std::cout << "i = " << x << " ";};
void arg_ii(const OneI &x) { std::cout << "/ ii = " << x.a << " ";};
};
ABC::ABC() {
arg_i(def_i);
arg_ii(def_ii);
}
const int ABC::def_i = StaticClass::i;
const OneI ABC::def_ii = StaticClass::ii;
int main() {
ABC a;
std::cout << '\n';
}
/* End: abc.cpp */
/* File: ONE.cpp */
#include <iostream>
#include "ONE.hpp"
const int StaticClass::i = 2;
const OneI StaticClass::ii = OneI{333};
/* End: ONE.cpp */
/* File: ONE.hpp */
#include <iostream>
#ifndef One
#define One
struct OneI {
OneI(int a_) : a(a_) { }
int a;
};
struct StaticClass {
const static int i;
const static OneI ii;
};
#endif // One header guard
/* End: ONE.hpp */
आप स्थैतिक और गतिशील प्रारंभिक चरणों और गतिशील प्रारंभिकरण के आवश्यक क्रम को कैसे स्थापित करना चाहते हैं, विस्तृत करना चाहते हैं। अन्यथा आपका उत्तर आधा कहानी से कम है। –
@MaximEgorushkin मैंने स्थिर और गतिशील प्रारंभिकरण के बारे में विस्तार जोड़ा। हालांकि यह समझने में मदद करता है कि क्यों प्रारंभिक 'स्टेटिक क्लास :: ii' का मान 0 होना चाहिए, मैं इस सवाल के महत्व के बारे में असहमत हूं। – user2079303
ऑर्डर ए है) शून्य-प्रारंभिकरण, बी) स्थिर प्रारंभिकरण, सी) गतिशील प्रारंभिकरण? और चूंकि 'const int StaticClass :: i = 2' b है),' const int एबीसी :: def_i = StaticClass :: i' क्या है? गतिशील मैं अनुमान लगाऊंगा। – toting