1

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

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

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

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;
}
4

2 回答 2

2

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

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

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

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

于 2015-12-03T18:48:08.943 回答
1

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

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

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

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

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

int atexit(void (*func)()) {
    return 0;
}
于 2015-12-03T19:19:30.193 回答