関数から戻るためのより正しい方法は次のとおりです。
void function() {
// blah some code
}
OR
void function() {
// blah some code
return;
}
2番目の方法の理由:
このようなシナリオがあるとします-関数の束があり、それらの関数の最後にいくつかのコードを注入する必要があります。しかし、何らかの理由で、このような膨大な量の機能を必要としない/変更できない。あなたはそれについて何ができますか? 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;
}
どちらも正確ではないので、選んでください。空のreturn;
ステートメントは、void
関数でreturnを終了以外の場所から許可するために提供されています。私が信じる他の理由はありません。
Void関数でリターンを行う唯一の理由は、何らかの条件付きステートメントのために早期に終了することです。
void foo(int y)
{
if(y == 0) return;
// do stuff with y
}
アンワインドが言ったように:コードが終了すると、それは終了します。最後に明示的に戻る必要はありません。
最初の方法は「より正確」で、表現する意図はありますか?コードが終了すると、終了します。私の意見では、それはかなり明確です。
混乱を招く可能性があり、説明が必要なものがわからない。ループ構造が使用されていない場合、関数の実行が停止する以外に何が起こる可能性がありますか?
return
関数の最後にあるこのような無意味な余分なvoid
ステートメントにイライラするのは、それが明らかに目的を果たさず、元のプログラマーが「これについて混乱している」と感じさせるからです。そして今、あなたもそうすることができます!」これはあまり良くありません。
古い質問ですが、とにかく答えます。尋ねられた実際の質問への答えは、裸のリターンは冗長であり、除外されるべきであるということです。
さらに、次の理由により、推奨値はfalseです。
if (ret<0) return;
Cの予約語をマクロとして再定義することは、一見悪い考えですが、この特定の提案は、引数としてもコードとしてもサポートされません。