Статические члены C ++ в микроконтроллере - PullRequest
0 голосов
/ 10 октября 2018

Я пишу код на 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 ++?

EDIT

Не удается скопировать файл запуска, так как он слишком большой.Во всяком случае, я получил его для примера проекта, и это data_init , bss_init разделы и тому подобное.

1 Ответ

0 голосов
/ 10 октября 2018

Исправлено путем переименования файла запуска startup_mk22f51212.c в startup_mk22f51212.cc, чтобы компилятор C ++ его собирал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...