繁体   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