Я пишу код на C ++, который будет работать на микроконтроллере. Более конкретно, целевой mcu является K22, и я использую для этого компилятор MCXpresso от NXP.
Я заметил, что статические члены класса не инициализируются при запуске. Например, см. Код ниже:
class B {
public:
B() { std::cout << "Init B" << std::endl;}
};
class A {
public:
static B b;
static A *instance;
static A *getInstance() {
if (!instance) {
instance = new A;
}
return instance;
}
private:
A() {
std::cout << "Init A" << std::endl;
}
};
A* A::instance;
B A::b;
int main() {
return 0;
}
Если вы построите это без каких-либо оптимизаций или чего-либо еще в обычной цели Linux и запустите его, вы увидите, что он выведет Init B
, так как B является статическим членом и инициализируется кодом запуска libc.
Если я делаю то же самое в моем K22 MCU, я не вижу инициализации A :: b в любое время. И, конечно, если я получу доступ к A :: getInstance () -> b, b будет нулевым.
Вероятно, это вопрос для парней MCUXpresso, но является ли это общим ограничением, когда речь заходит о C ++ на микроконтроллерах? Может быть, мне нужен определенный файл запуска для C ++?
РЕДАКТИРОВАТЬ
Не удалось скопировать файл запуска, так как он слишком большой. Во всяком случае, я получил его для примера проекта, и это data_init, bss_init разделы и тому подобное.
Исправлено путем переименования файла запуска startup_mk22f51212.c
в startup_mk22f51212.cc
так что компилятор C ++ его строит.
Других решений пока нет …