5

次の不自然な例を考えてみましょう。

void HandleThat() { ... }

void HandleThis()
{
    if (That) return HandleThat();
    ...
}

このコードは問題なく動作し、仕様が有効であると確信していますが、両方の関数がプロトタイプ化されているにもかかわらず、呼び出しが関数の結果を返すように見えるため、私は(おそらく私自身で)この珍しいスタイルを検討します無効になります。

通常、私は次のことを期待します。

if (That) {HandleThat(); return;}

これは、何が起こっているのかについて曖昧さを残さないと私は感じています。

SOコミュニティ、returning-voidコーディングスタイルが混乱しているのか、問題があるのか​​について意見をいただけますか?それはイディオムの感触を持っています。これを使うべきですか、それとも避けるべきですか?

一般的に、私は明快さを追求し、2番目のスタイルを使用します。一方で、最初の形には、私をいくらか惹きつける清楚さがあります。

4

5 に答える 5

13

私はあなたに同意します、ある種の価値が返されるという含意があるので、最初のスタイルは混乱しています。実際、そのために私はそれを数回読まなければなりませんでした。

voidのプロトタイプを作成した関数から戻るときは、単にreturnにする必要があります。

于 2009-08-06T19:31:46.247 に答える
11

これはおそらく少し賢すぎます。その行が関数の先頭から数行以上離れている場合は、混乱を招きます。また、コードを見ているプログラマーは、

return HandleThat();

void returnタイプを使用して、コードを実際に理解する前に賢さを理解してください。if / elseブランチで複数のことを行う場合は、実際には中括弧を使用して、ステップを別の行に配置する必要があります。より多くのスペースを占有しますが、理解しやすくなります。

if (That) {
    HandleThat();
    return;
}
于 2009-08-06T19:33:24.870 に答える
4

C言語の規則では、voidを返すと宣言された関数が式を返そうとした場合、その式は評価されません。

http://c0x.coding-guidelines.com/6.8.6.4.html

于 2009-08-06T19:36:00.450 に答える
3

これまで見たことがない。

これには、void以外の戻り型の一般的なイディオムのように見えるという利点があるため、非常に簡単に読み取ることができます...

誰かがそれが無効であることを示すことができない限り、私はそれを変更しません。

于 2009-08-06T19:33:47.037 に答える
2

最初のバージョンは、主にテンプレート プログラミングを容易にするために許可されていると思います。HandleThat が void である場合もそうでない場合もある型 T を返した場合、最初のバージョンを使用すると便利です。

しかし、「通常の」ケースでは、2 番目のバージョンの方が明確であり、私はそれを好みます。

于 2009-08-06T21:10:12.063 に答える