如何知道 ncurses 的 initscr() 是否被调用过?

How to know if initscr() of ncurses has been called earlier?

目前比较好奇的是,有没有办法知道 <ncurses.h>initscr() 之前是否被调用过?我认为调用 initscr() 两次是个坏主意。

您可能有一个 bool 变量,它被初始化为 false,并在调用 initscr()(并执行其他初始化)后立即设置为 true。缺点是你必须记得检查 bool 变量,并在调用 initscr() 后设置它。

link中有一个简单的例子:http://math.hws.edu/orr/s04/cpsc225/curses.html

注意:正如 Jonathon Leffler 在评论中指出的那样,这个 link 总体上不是一个很好的例子,我只是向您指出他初始化所有内容的代码片段来举个例子。

我对这个库不熟悉,不过看起来你也可以声明一个 WINDOW* 并将其设置为 null,然后稍后检查它是否为 null 以查看它是否被调用.我从谷歌搜索中找到的文档说,在失败时函数不会 return 所以如果它是 运行 你就不会有空指针。这在本质上与使用 bool 相同,但可能不那么混乱(检查指针以查看它们是否为 null 是常见的 C 习惯用法)。

一种非常 C++ 的方法是创建一个 class 来包装 WINDOW*,或者由函数 return 编辑的任何内容,然后调用 initscr( ) 在构造函数中。如果有相应的函数来释放它,在析构函数中调用它。通过使用a singleton design pattern,class只能构造一次。

一种更安全的方法是将 WINDOW* 包装在 std::unique_ptr 中,但将自定义删除器传递给它 (How do I use a custom deleter with a std::unique_ptr member?) - 假设有一个函数可以解除分配 window.

那你的析构函数什么都不需要,智能指针会帮你处理。

initscr is called successfully, it sets the variables stdscr and curscr, which are only non-null after initialization. You do not need extra variables for this purpose. curses also initializes the variables LINES and COLS, which usually give the actual screen size (except as noted in the use_env 手册页时)。

如评论中所述,如果成功,initscr 只会向调用者发送 return。它的补码 newterm 初始化相同的变量,但如果不成功可以 return 给调用者。