我正在编写一些将在微控制器上运行的 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_init,bss_init部分等。