目前更多的是好奇心,有没有办法知道initscr()
<ncurses.h>
之前是否曾被召唤过?我认为两次打initscr()
是一个坏主意。
答案 0 :(得分:6)
成功调用initscr
时,它会设置变量stdscr
和curscr
,这些变量在初始化后仅为非null。为此,您不需要额外的变量。诅咒initializes变量LINES
和COLS
,通常会给出实际的屏幕尺寸(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?) - 假设有一个释放窗口的函数。
然后你在析构函数中不需要任何东西,智能指针会为你处理它。