2011-04-05 91 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); 
}