为什么在 C++ 中声明静态成员会导致 linker 到 link atexit

why does declaring a static member in c++ cause the linker to link the atexit

如果我将 sensor 声明为静态 - 链接器会抱怨 未定义对 atexit 的引用。

如果我将传感器声明为非静态 - 它不会 - 为什么?

//c++中的静态函数class

AP_Compass_Backend *AP_Compass_HMC5843::detect(Compass &compass)
{

    static AP_Compass_HMC5843 sensor(compass);
    bool result = sensor.init();

    if (result == false) {
        return NULL;
    }
    return &sensor;
}

显然在该平台中,本地静态持续时间对象的销毁是通过注册 atexit 调用来完成的。

销毁全局变量不需要任何东西,因为销毁可以在退出时显式完成 main 只需按正确的顺序调用所有析构函数。

然而,对于本地 statics,对象可能尚未构造(如果未输入函数),因此您需要一种动态注册销毁的方法。请记住,函数级静态对象是在第一次进入范围时构造的(并且只有在进入范围时)...这是 C++ 的保证。

动态析构函数链可以手动实现(例如,保留链表),但依赖 atexit 似乎是另一个可行的选择。

If I declare sensor as static - the linker complains about an undefined reference to atexit.

您平台的编译器似乎使用 atexit 函数来销毁静态对象。如果 he/she 想在应用程序结束后执行一些代码,程序员通常会使用 atexit

If I declare the sensor as non static - it does not - WHY?

好吧,因为这样就没有应该调用其析构函数的静态全局对象了。

您可能会使用一些 library/code,如果它不允许破坏静态对象,则没有考虑到您平台的限制 - 那么这可能是因为这是不可能的情况。我建议添加空 atexit 函数如下:

int atexit(void (*func)()) {
    return 0;
}