2012-01-25 65 views
45

哪個更正確的方式來從函數返回返回:從void函數

void function() { 
    // blah some code 
} 

OR

void function() { 
    // blah some code 
    return; 
} 

理由第二種方式:

  1. 它表達了開發商意圖更清楚。
  2. 它有助於在預編譯時檢測功能結束:

假設你有這樣的scenario-你有一大堆的功能,你必須在這些功能的最終注入一些代碼。但出於某些原因,您不希望/或不能修改如此巨大的功能。你能做些什麼? Return & macro進場,例如:

#include<stdio.h> 

#define MAX_LINES 1000 
#define XCAT(a,b) a##b 
#define CAT(a,b) XCAT(a,b) 
#define return returns[__LINE__] = 1;\ 
     if (returns[__LINE__])\ 
      {printf("End of function on %d line.\n",__LINE__);}\ 
     int CAT(tmp,__LINE__); \ 
     if ((CAT(tmp,__LINE__)=returns[__LINE__], returns[__LINE__] = 0, CAT(tmp,__LINE__)))\ 
       return 

static int returns[MAX_LINES]; 


void function1(void) { 
    return; 
} 

void function2(void) { 
    return; 
} 

int main() 
{ 
    function1(); 
    function2(); 

    return 0; 
} 
+3

有趣的問題,但投票結束,因爲它太主觀,可能會導致一些衝突。可能更好的程序員.stackoverflow.com。還請記住閱讀FAQ。 –

+4

這是一個插入冗餘關鍵字的風格問題。 – stacker

+0

@stacker - 對於一種情況,多餘的東西不適用於另一種情況。 –

回答

48

兩者都不是更正確的,所以請選擇。提供空的return;聲明以允許函數在void函數中返回以外的地方。沒有其他理由我相信。

+1

準確的目的我現在要用它;) – nirvanaswap

22

第一種方式是「更正確」,有什麼用意莫不是想表達什麼?如果代碼結束,它結束。在我看來,這很清楚。

我不明白什麼可能會混淆,需要澄清。如果沒有使用循環構造,那麼除了該函數停止執行之外可能發生什麼?

我將是這樣一個毫無意義的額外return聲明在void函數結束severly惱火,因爲它顯然沒有任何意義,只是讓我覺得原來的程序員說,「我很困惑這個,現在你可以也是!「這不是很好。

48

有一個void函數返回會提前退出,由於一些條件語句的唯一原因......

void foo(int y) 
{ 
    if(y == 0) return; 

    // do stuff with y 
} 

由於開卷說,當代碼結束,它結束。最後不需要明確的回報。

+0

** C ** standerd說什麼?在'void'返回函數中使用'return;'是合法的。 – roottraveller

1

一個古老的問題,但我會回答。對實際問題的回答是,裸收益是多餘的,應該排除在外。

此外,建議值,原因如下錯誤:

if (ret<0) return; 

重新定義一個C保留字作爲宏是在它的面前是一個壞主意,但這個特殊的建議很簡單得不到支持,無論是作爲參數和代碼。