Как зарегистрировать не пустую функцию с помощью atexit ()?

Я пытаюсь зарегистрировать функцию, которая возвращает int вызываться в конце программы, используя atexit() функция. (В частности, endwin() функция от ncurses.)

Но с тех пор atexit() нужен указатель на void функция, я столкнулся с проблемой. Я попробовал следующее:

static_cast<void (*)()>(endwin)

но static_castиз int функция к void функция не разрешена

Возможно ли вообще то, что я пытаюсь достичь, и если да, то как?

Замечания: Я готов просто игнорировать возвращаемое значение функции.


Редактировать: Я также попытался создать лямбда-функцию, которая, кажется, делает то, что я хочу:

atexit([]{ endwin(); });

Это хорошее решение по сравнению с функцией упаковки / пересылки? (Кроме этого ему нужен C ++ 11 и он не определяет новую функцию, единственной целью которой является просто пересылка другой функции.)

13

Решение

Указатели функций не могут быть преобразованы. Просто зарегистрируйте функцию пересылки:

#ifdef __cplusplus
extern "C"#endif
void endwin_wrapper() { endwin(); }
...
atexit(endwin_wrapper);

Поскольку вы пометили свой вопрос C ++: если вы определяете функцию пересылки в C ++, вам нужно объявить ее как extern "C" иметь правильную языковую связь.

23

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

С текущим стандартом C ++, лямбда вероятно, лучшее решение для этого:

atexit([]{ endwin(); });

Теперь нет необходимости определять целую новую именованную функцию с единственной целью — просто переслать другую функцию.


И если вы однажды решите, что вам нужно вызывать больше функций при выходе из программы, вы можете определить их с помощью нового вызова atexit():

atexit(anotherCleanupFunction);

или вы можете просто добавить их в лямбда-тело:

atexit([]{
anotherCleanupFunction();
endwin();
});

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

11

«Возможно ли вообще то, что я пытаюсь достичь, и если да, то как?»

Вы просто пишете свою собственную функцию-обертку для endwin() и зарегистрируйте это

void myEndwin() {
endwin();
}
6
По вопросам рекламы [email protected]