0

我正在编写一些将在微控制器上运行的 C++ 代码。更具体地说,目标 mcu 是 K22,我为此使用 NXP 的 MCUXpresso 编译器。

我注意到静态类成员在启动时没有被初始化。例如,请看下面的代码:

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 单片机中做同样的事情,我看不到 A::b 在任何时候被初始化。当然,如果我访问 A::getInstance()->b,b 为空。

这可能是 MCUXpresso 家伙的一个问题,但是当涉及到微控制器上的 C++ 时,这是一个常见的限制吗?也许我需要一个特定的 C++ 启动文件?

编辑

无法复制启动文件,因为它太大。无论如何,我得到了一个示例项目,它是data_initbss_init部分等。

4

1 回答 1

0

startup_mk22f51212.c通过重命名启动文件来修复此问题,startup_mk22f51212.cc以便 C++ 编译器构建它。

于 2018-10-10T10:18:48.640 回答