Escribo un kernel pequeño con C++ 11 y tengo dos instancias con el mismo tipo que deben construirse antes de que se creen otros objetos estáticos.Controlar el orden del constructor de objetos estáticos
El código que he escrito es el siguiente:
// 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
}
Se construye y funciona como se esperaba, sin ningún mensaje de aviso, pero no con LTO.
Recibo un montón de mensajes de advertencia quejándose de la coincidencia de tipos y me pregunto si hay una solución, ya que me confunde para encontrar los otros mensajes de advertencia o error 'reales'.
¿Alguna sugerencia?
¿Qué estás * realmente * tratando de hacer? En los comentarios a la respuesta de Pubby a continuación, dice que desea inicializar varios objetos del mismo tipo. Para mí, parece que le gustaría inicializar estructuras relacionadas con el soporte de C++, como el montón, antes de dejar que la implementación llame a otros constructores. Pero eso no suena como lo que estás intentando. Además, ¿de qué tipo de "coincidencia de tipos" obtienes advertencias? – Potatoswatter
@Potatoswatter una gran cantidad de 'advertencia: el tipo de 'xxx' no coincide con la declaración original [habilitada por defecto]' cosas. Es porque el tipo real no es prueba sino char []. Pensé que podría desactivar el constructor estático pero parece que no hay forma de hacerlo. – kukyakya
Ah, ya veo. Lo que debes hacer es 'char fake_inst1 [sizeof (test)]; test * const inst1 = reinterpet_cast < test * > (fake_inst1); ' – Potatoswatter