почему объявление статического члена в c ++ приводит к тому, что компоновщик связывает atexit

Если я заявляю датчик как статический — компоновщик жалуется на неопределенная ссылка на 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;
}

1

Решение

Если я объявляю датчик как статический — компоновщик жалуется на неопределенную ссылку на atexit.

похоже на компилятор для вашей платформы atexit функция уничтожения статических объектов. Обычно atexit используется программистом, если он / она хочет выполнить некоторый код после завершения приложения.

Если я объявляю датчик не статичным — это не так — ПОЧЕМУ?

хорошо, потому что тогда нет статических глобальных объектов, чьи деструкторы должны вызываться.

Вполне возможно, что вы используете какую-то библиотеку / код, который не учитывает ограничения вашей платформы, если он не позволяет уничтожать статические объекты — тогда может быть, это потому, что сценарий невозможен. Я предлагаю добавить пустой atexit функция как ниже:

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

Другие решения

По-видимому, на этой платформе уничтожение локальных статических объектов продолжительности осуществляется путем регистрации atexit вызов.

Уничтожение глобалов ничего не требует, потому что уничтожение может быть выполнено явно при выходе main просто вызывая все деструкторы в правильном порядке.

Для местных staticОднако, возможно, объект не был построен (если функция не была введена), поэтому вам нужен способ динамической регистрации для уничтожения. Пожалуйста, помните, что статический объект уровня функции создается при первом входе в область действия (и ТОЛЬКО если вводится область действия) … это гарантия C ++.

Динамическая цепочка деструкторов могла быть реализована вручную (например, ведение связанного списка), но полагаясь на atexit кажется еще одним жизнеспособным вариантом.

2

По вопросам рекламы [email protected]