web-dev-qa-db-ja.com

void関数から戻る

関数から戻るためのより正しい方法は次のとおりです。

void function() {
  // blah some code
}

OR

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

2番目の方法の理由:

  1. 開発者の意図をより明確に表現します。
  2. プリコンパイル時に関数の終了を検出するのに役立ちます。

このようなシナリオがあるとします-関数の束があり、それらの関数の最後にいくつかのコードを注入する必要があります。しかし、何らかの理由で、このような膨大な量の機能を必要としない/変更できない。あなたはそれについて何ができますか? Returnmacroが登場します。例:

#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;
}
58

どちらも正確ではないので、選んでください。空のreturn;ステートメントは、void関数でreturnを終了以外の場所から許可するために提供されています。私が信じる他の理由はありません。

58
William Morris

Void関数でリターンを行う唯一の理由は、何らかの条件付きステートメントのために早期に終了することです。

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

    // do stuff with y
}

アンワインドが言ったように:コードが終了すると、それは終了します。最後に明示的に戻る必要はありません。

55
Tevo D

最初の方法は「より正確」で、表現する意図はありますか?コードが終了すると、終了します。私の意見では、それはかなり明確です。

混乱を招く可能性があり、説明が必要なものがわからない。ループ構造が使用されていない場合、関数の実行が停止する以外に何が起こる可能性がありますか?

return関数の最後にあるこのような無意味な余分なvoidステートメントにイライラするのは、それが明らかに目的を果たさず、元のプログラマーが「これについて混乱している」と感じさせるからです。そして今、あなたもそうすることができます!」これはあまり良くありません。

24
unwind

古い質問ですが、とにかく答えます。尋ねられた実際の質問への答えは、裸のリターンは冗長であり、除外されるべきであるということです。

さらに、次の理由により、推奨値はfalseです。

if (ret<0) return;

Cの予約語をマクロとして再定義することは、一見悪い考えですが、この特定の提案は、引数としてもコードとしてもサポートされません。

1
don provan