簡體   English   中英

如何使用atexit()注冊非空函數?

[英]How to register a non-void function with atexit()?

我正在嘗試注冊一個函數,該函數使用atexit()函數返回要在程序結尾處調用的int (具體來說,來自ncurses的endwin()函數。)

但是由於atexit()需要一個指向void函數的指針,所以我遇到了一個問題。 我嘗試了以下方法:

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

但是似乎不允許從int函數到void函數進行static_cast轉換。

我要完成的工作是否完全可能,如果可以,怎么辦?

注意:我只想忽略該函數的返回值。


編輯:我也嘗試創建一個lambda函數,它似乎可以實現我想要的功能:

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

與包裝器/轉發功能相比,這是一個好的解決方案嗎? (除此之外,它需要C ++ 11並避免定義一個僅用於轉發另一個功能的新功能。)

函數指針無法轉換。 只需注冊一個轉發功能:

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

由於您標記了問題C ++:如果您在C ++中定義了轉發函數,則需要將其聲明為extern "C"以具有正確的語言鏈接。

對於當前的C ++標准, lambda可能是對此的最佳解決方案:

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

現在,無需僅轉發另一個函數就可以定義一個全新的命名函數。


而且,如果您有一天決定需要在程序退出時調用更多函數,則可以通過對atexit()的新調用來定義它們:

atexit(anotherCleanupFunction);

或者,您可以將它們添加到lambda主體中:

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

但是 ,當您要向atexit()注冊多個函數時,一個單獨的包裝器函數來保存所有這些函數可能是一個更好的解決方案。 但是,沒有一個正確的答案,只是編寫良好而清晰的代碼。 (通過充滿函數調用的lambda來調用atexit()看起來很混亂。)

“這是我正在努力實現的目標,如果是的話,如何實現?”

您只需為endwin()編寫自己的包裝函數,然后注冊該函數即可

void myEndwin() {
    endwin();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM