के क्रम को नियंत्रित करना मैं सी ++ 11 के साथ एक छोटा कर्नेल लिख रहा हूं और उसी प्रकार के दो उदाहरण हैं जिन्हें किसी भी अन्य स्थिर वस्तुओं के निर्माण से पहले बनाया जाना है।स्थैतिक वस्तुओं के कन्स्ट्रक्टर
// test.hpp
class test {
// blahblah...
};
// test.cpp
typedef char fake_inst[sizeof(test)] __attribute__((aligned(alignof(test))));
fake_inst inst1;
fake_inst inst2;
// main.cpp
extern test inst1;
extern test inst2;
int kmain() {
// copy data section
// initialize bss section
new (&inst1) test();
new (&inst2) test();
// call constructors in .init_array
// kernel stuffs
}
यह बनाता है और अपेक्षा के अनुरूप नहीं चेतावनी संदेश के बिना, लेकिन LTO साथ नहीं काम करता है:
कोड मैंने लिखा इस प्रकार है।
मुझे मिलान मिलान की शिकायत करने वाले कई चेतावनी संदेश मिलते हैं और मुझे आश्चर्य है कि कोई कामकाज है क्योंकि यह मुझे अन्य 'असली' चेतावनी या त्रुटि संदेशों को खोजने में भ्रमित करता है।
कोई सुझाव?
आप वास्तव में क्या करने की कोशिश कर रहे हैं? नीचे पब्बी के उत्तर की टिप्पणियों में आप कहते हैं कि आप एक ही प्रकार की कई वस्तुओं को प्रारंभ करना चाहते हैं। मेरे लिए, ऐसा लगता है कि कार्यान्वयन को अन्य रचनाकारों को कॉल करने से पहले, आप ढेर जैसे सी ++ समर्थन से संबंधित संरचनाओं को प्रारंभ करना चाहते हैं। लेकिन यह आपके जैसा प्रयास करने की तरह नहीं लगता है। इसके अलावा, आपको किस तरह के "प्रकार मिलान" के बारे में चेतावनियां मिलती हैं? – Potatoswatter
@Potatoswatter बहुत सी चेतावनी: 'xxx' का प्रकार मूल घोषणा [डिफ़ॉल्ट रूप से सक्षम] से मेल नहीं खाता है 'चीजें। ऐसा इसलिए है क्योंकि वास्तविक प्रकार परीक्षण नहीं है लेकिन char []। मैंने सोचा कि मैं स्थैतिक कन्स्ट्रक्टर को अक्षम कर सकता हूं लेकिन ऐसा लगता है कि ऐसा करने का कोई तरीका नहीं है। – kukyakya
आह, मैं देखता हूं। आपको क्या करना चाहिए 'char fake_inst1 [sizeof (test)]; परीक्षण * const inst1 = reinterpet_cast < test * > (fake_inst1); ' – Potatoswatter