c/ncurses-对不同的程序部分使用getch

c/ncurses-对不同的程序部分使用getch,c,keyboard,ncurses,getch,C,Keyboard,Ncurses,Getch,我正在编写一个简单的ncurses程序,其中包含一个菜单和创建/查看等不同部分,所有这些都使用键盘。目前,我有一个getkey例程,然后切换以确定键盘输入用于哪个部分,如下所示: ch = getch(); if(menu){ switch(ch){ ... if(create){ switch(ch){ ... if(view){ switch(ch){ ... 这是最好的方法还是我应该为每个部分设置不同的getkey例程菜单、视图等等-最好的方法是什么?这需要

我正在编写一个简单的ncurses程序,其中包含一个菜单和创建/查看等不同部分,所有这些都使用键盘。目前,我有一个getkey例程,然后切换以确定键盘输入用于哪个部分,如下所示:

ch = getch();

if(menu){
    switch(ch){
...

if(create){
    switch(ch){
...

if(view){
    switch(ch){
...

这是最好的方法还是我应该为每个部分设置不同的getkey例程菜单、视图等等-最好的方法是什么?

这需要一些设计,因此可能有点主观,但我认为你的方法很好。它允许您在深入研究细节之前处理接近getch的公共输入逻辑,通常情况下,处理事件(例如,如果可能的话,在单个位置处理键盘输入)是一个好主意-随着程序的增长,多个事件循环往往会变得混乱

类似的书写方式如下:

enum { MENU, CREATE, VIEW } input_focus = MENU;

...

void input_loop(void) {
    for (;;) {
        int ch = getch();

        /* Put common input logic here. */

        switch (input_focus) {
        case MENU:
            handle_menu_input(ch);
            break;

        case CREATE:
            handle_create_input(ch);
            break;

        case VIEW:
            handle_view_input(ch);
            break;
        }
    }
}
你的个案可能需要有更多的逻辑,但你明白了

具有简短的函数有助于提高可读性。现代编译器足够聪明,可以内联只调用一次的函数,删除函数调用并直接插入代码,因此不必担心性能。如果有人挑剔地读到了这一点——是的,这需要对不同编译单元中的函数进行链接时间优化

另一种选择是使用一个更新后始终指向当前输入焦点的函数指针,而不是使用开关,但在这里这太过分了。这是C++对虚拟函数的作用。