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

时间:2015-07-18 02:15:22

标签: c++ ncurses curses

目前更多的是好奇心,有没有办法知道initscr() <ncurses.h>之前是否曾被召唤过?我认为两次打initscr()是一个坏主意。

2 个答案:

答案 0 :(得分:6)

成功调用initscr时,它会设置变量stdscrcurscr,这些变量在初始化后仅为非null。为此,您不需要额外的变量。诅咒initializes变量LINESCOLS,通常会给出实际的屏幕尺寸(use_env手册页中所述除外)。

如评论中所述,initscr仅在成功时返回给调用者。它的补码newterm初始化相同的变量,但如果不成功则可以返回给调用者。

答案 1 :(得分:1)

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

此链接中有一个简单的示例:http://math.hws.edu/orr/s04/cpsc225/curses.html

注意:正如Jonathon Leffler在评论中指出的那样,这个链接并不是一个很好的例子,我只是指向你的代码片段,在那里他初始化所有内容以举例说明。

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

一种非常C ++的方法是创建一个包装WINDOW *的类,或者函数返回的任何类,然后在构造函数中调用initscr()。如果有相应的函数来解除分配它,请在析构函数中调用它。通过使用a singleton design pattern,该类只能构造一次。

更安全的方法是将WINDOW *包装在std :: unique_ptr中,但将自定义删除器传递给它(How do I use a custom deleter with a std::unique_ptr member?) - 假设有一个释放窗口的函数。

然后你在析构函数中不需要任何东西,智能指针会为你处理它。