Я пытаюсь зарегистрировать функцию, которая возвращает int
вызываться в конце программы, используя atexit()
функция. (В частности, endwin()
функция от ncurses.)
Но с тех пор atexit()
нужен указатель на void
функция, я столкнулся с проблемой. Я попробовал следующее:
static_cast<void (*)()>(endwin)
но static_cast
из int
функция к void
функция не разрешена
Возможно ли вообще то, что я пытаюсь достичь, и если да, то как?
Замечания: Я готов просто игнорировать возвращаемое значение функции.
Редактировать: Я также попытался создать лямбда-функцию, которая, кажется, делает то, что я хочу:
atexit([]{ endwin(); });
Это хорошее решение по сравнению с функцией упаковки / пересылки? (Кроме этого ему нужен C ++ 11 и он не определяет новую функцию, единственной целью которой является просто пересылка другой функции.)
Указатели функций не могут быть преобразованы. Просто зарегистрируйте функцию пересылки:
#ifdef __cplusplus
extern "C"#endif
void endwin_wrapper() { endwin(); }
...
atexit(endwin_wrapper);
Поскольку вы пометили свой вопрос C ++: если вы определяете функцию пересылки в C ++, вам нужно объявить ее как extern "C"
иметь правильную языковую связь.
С текущим стандартом C ++, лямбда вероятно, лучшее решение для этого:
atexit([]{ endwin(); });
Теперь нет необходимости определять целую новую именованную функцию с единственной целью — просто переслать другую функцию.
И если вы однажды решите, что вам нужно вызывать больше функций при выходе из программы, вы можете определить их с помощью нового вызова atexit()
:
atexit(anotherCleanupFunction);
или вы можете просто добавить их в лямбда-тело:
atexit([]{
anotherCleanupFunction();
endwin();
});
тем не мение, если у вас есть несколько функций для регистрации в atexit()
тогда отдельная функция-обертка для хранения всех этих функций может быть лучшим решением. Там нет одного правильного ответа, просто написать хороший и понятный код. (Призыв к atexit()
с лямбдой, полной вызовов функций, может выглядеть довольно грязно.)
«Возможно ли вообще то, что я пытаюсь достичь, и если да, то как?»
Вы просто пишете свою собственную функцию-обертку для endwin()
и зарегистрируйте это
void myEndwin() {
endwin();
}