2011-04-05 85 views
0

我有几个函数。基本上是一个菜单,用户可以选择1-n个不同的选项,每个选项都有一个与它们相关的功能。在这个例子中,它被愚弄了。干净地退出C函数

我想确定的是过早退出函数的最佳方法。例如,当用户在菜单选项的功能中按下Enter时,我希望程序将它们发送回菜单,而不在该功能中运行任何其他功能。

在以下情况下,我只需拨打showMenu()并在其后放置return声明。唯一的问题是,如果用户退出多个函数,那么会有一系列返回语句需要在最后解开。

有人请告诉我是否有更高效的方法来实现这一点,或者我是否有钱。

void showMenu() 
{ 
    //Display menu 

    //Prompt user for menu option 

    //Run function of appropriate menu option 
    runSelectedFunction(); 
} 

void runSelectedFunction() 
{ 
    //Get user input for the function and validate 

    //Check if the user input was only a '\n' if so show the menu and exit 
    showMenu(); 
    return; 

    //Do the stuff that this function is meant to do. 
} 
+1

单入口单出口使程序更容易阅读。 – 2011-04-05 05:37:22

回答

4

对我很好。或者 - 因为周围有很多是针对具有多个出口点形成一个单一的功能 - 你可以这样做:

void func() 
{ 
    //get input 

    if (checkMenu()) 
    { 
     //do the stuff I am meant to do 
    } 
    else 
    { 
     showMenu(); 
    } 
} 

,这样你就避免了添加第二回你的函数。你也可以有showMenu()电话总是在函数结束时,根据您的需要

心连心

马里奥

0

的最好方法?总之,不要。

为什么?

虽然没有什么技术上的不妥之处,你会发现它所有过的地方,它可以试图追查在复杂的代码中的错误或内存泄漏时,有时会导致头痛。

使用早期只有在绝对必要的,甚至然后设法找到返回替代第一:)

+0

一旦用户按下回车键,你会如何建议解决返回菜单的问题? – Chris 2011-04-05 05:40:39

+0

如果不知道有关该计划的更多信息,很难回答。然而,我可能会实现一种观察者设计模式(http://en.wikipedia.org/wiki/Observer_pattern),当用户按下Enter键时(也许在其他事件上有不同的对象)构造一个事件对象,然后调度它在函数返回之前。 – 2011-04-05 06:00:11

+0

比我需要的这个应用程序稍微复杂一些,但绝对是我将会理解的东西。谢谢! – Chris 2011-04-05 06:04:43

0

另一种方法是使用下面的模式来确保你的函数总是从一个地方返回,让您有机会到永远免费资源(或报告错误等):

int func(void) 
{ 
    int ret = 0; 

    do 
    { 
     if (!allocate_resource()) 
     { 
      ret = -1; 
      break; 
     } 

     if (!allocate_more_resources()) 
     { 
      ret = -2; 
      break; 
     } 

     do_stuff(); 
    } 
    while (0); 

    free_allocated_resources(); 

    return (ret); 
}