Tôi đang viết một hạt nhân nhỏ với C++ 11 và có hai cá thể cùng loại mà phải được tạo trước khi bất kỳ đối tượng tĩnh nào khác được tạo.Kiểm soát thứ tự của hàm tạo đối tượng tĩnh
Mã tôi đã viết như sau:
// 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
}
Nó xây dựng và các công trình như mong đợi mà không có tin nhắn cảnh báo, nhưng không phải với LTO.
Tôi nhận được rất nhiều thông báo cảnh báo phàn nàn về loại đối sánh và tôi tự hỏi liệu có giải pháp nào không vì nó làm tôi bối rối khi tìm thấy thông báo lỗi hoặc cảnh báo 'thực' khác.
Bất kỳ đề xuất nào?
Bạn đang * thực sự * đang cố gắng làm gì? Trong phần bình luận của Pubby dưới đây bạn nói rằng bạn muốn khởi tạo một vài đối tượng cùng loại. Với tôi, có vẻ như bạn muốn khởi tạo các cấu trúc liên quan đến hỗ trợ C++, chẳng hạn như vùng heap, trước khi cho phép thực hiện gọi các nhà xây dựng khác. Nhưng điều đó không giống như những gì bạn đang cố gắng. Ngoài ra, bạn sẽ nhận được cảnh báo loại "loại đối sánh" nào? – Potatoswatter
@Potatoswatter rất nhiều cảnh báo: loại ‘xxx’ không khớp với khai báo ban đầu [được bật theo mặc định] 'mọi thứ. Đó là vì loại thực tế không phải là thử nghiệm nhưng char []. Tôi nghĩ rằng tôi có thể vô hiệu hóa constructor tĩnh nhưng dường như không có cách nào để làm điều đó. – kukyakya
Ah, tôi hiểu rồi. Những gì bạn nên làm là 'char fake_inst1 [sizeof (test)]; test * const inst1 = reinterpet_cast < test * > (fake_inst1); ' – Potatoswatter