Если я заявляю датчик как статический — компоновщик жалуется на неопределенная ссылка на 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;
}
Если я объявляю датчик как статический — компоновщик жалуется на неопределенную ссылку на atexit.
похоже на компилятор для вашей платформы atexit
функция уничтожения статических объектов. Обычно atexit
используется программистом, если он / она хочет выполнить некоторый код после завершения приложения.
Если я объявляю датчик не статичным — это не так — ПОЧЕМУ?
хорошо, потому что тогда нет статических глобальных объектов, чьи деструкторы должны вызываться.
Вполне возможно, что вы используете какую-то библиотеку / код, который не учитывает ограничения вашей платформы, если он не позволяет уничтожать статические объекты — тогда может быть, это потому, что сценарий невозможен. Я предлагаю добавить пустой atexit
функция как ниже:
int atexit(void (*func)()) {
return 0;
}
По-видимому, на этой платформе уничтожение локальных статических объектов продолжительности осуществляется путем регистрации atexit
вызов.
Уничтожение глобалов ничего не требует, потому что уничтожение может быть выполнено явно при выходе main
просто вызывая все деструкторы в правильном порядке.
Для местных static
Однако, возможно, объект не был построен (если функция не была введена), поэтому вам нужен способ динамической регистрации для уничтожения. Пожалуйста, помните, что статический объект уровня функции создается при первом входе в область действия (и ТОЛЬКО если вводится область действия) … это гарантия C ++.
Динамическая цепочка деструкторов могла быть реализована вручную (например, ведение связанного списка), но полагаясь на atexit
кажется еще одним жизнеспособным вариантом.