为什么在 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
只需按正确的顺序调用所有析构函数。
然而,对于本地 static
s,对象可能尚未构造(如果未输入函数),因此您需要一种动态注册销毁的方法。请记住,函数级静态对象是在第一次进入范围时构造的(并且只有在进入范围时)...这是 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;
}
如果我将 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
只需按正确的顺序调用所有析构函数。
然而,对于本地 static
s,对象可能尚未构造(如果未输入函数),因此您需要一种动态注册销毁的方法。请记住,函数级静态对象是在第一次进入范围时构造的(并且只有在进入范围时)...这是 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;
}