web-dev-qa-db-ja.com

CおよびC ++でvoid型を返す

これは警告なしでコンパイルします。

これはCとC++で合法ですか、それともgccとclangで動作しますか?

合法である場合、C99の後の新しいものですか?

void f(){

}

void f2(){
    return f();
}

更新

「Rad Lexus」が示唆したように、私はこれを試しました:

$ gcc -Wall -Wpedantic -c x.c 
x.c: In function ‘f2’:
x.c:7:9: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
  return f();

$ clang -Wall -Wpedantic -c x.c 
x.c:7:2: warning: void function 'f2' should not return void expression [-Wpedantic]
        return f();
        ^      ~~~~~
1 warning generated.

$ gcc -Wall -Wpedantic -c x.cc
(no errors)

$ clang -Wall -Wpedantic -c x.cc
(no errors)

更新

誰かがこの構造がどのように役立つかを尋ねました。まあ、多かれ少なかれ構文上の砂糖です。良い例を次に示します。

void error_report(const char *s){
    printf("Error %s\n", s);
    exit(0);
}

void process(){
   if (step1() == 0)
      return error_report("Step 1");

   switch(step2()){
   case 0: return error_report("Step 2 - No Memory");
   case 1: return error_report("Step 2 - Internal Error");
   }

   printf("Processing Done!\n");
}
65
Nick

C11、6.8.6.4「returnステートメント」:

式を含むreturnステートメントは、戻り型がvoidである関数には現れません。

Novoidタイプであっても式を使用できません。

同じドキュメントの序文から:

第2版​​の主な変更点は次のとおりです。

[...]

  • 式を持たないreturnは、値を返す関数では許可されません(逆も同様)

したがって、これはC89-> C99(言語標準の第2版)からの変更であり、それ以来ずっとそうです。


C++ 14、6.6.3 "returnステートメント":

非void型の式を持つreturnステートメントは、値を返す関数でのみ使用できます[...] void型の式を持つreturnステートメントは、cv voidの戻り型を持つ関数でのみ使用できます。式は、関数が呼び出し元に戻る直前に評価されます。

はい、式ifを使用できます。これはvoid型です(C++ 98以降有効)。

71
DevSolar

このコードはC++Cでは許可されていません

From Return statement @ cppreference

Voidを返す関数では、式のタイプがvoidの場合、式を含むreturnステートメントを使用できます。


C11仕様ドラフトn1570のOTOH:

第2版の主な変更点:

値を返す関数で許可されていない式なしの戻り値(およびその逆)

returnは、voidを返す関数では許可されていない式で)

および6.8.6.4が戻ります

式を含むreturnステートメントは、戻り値の型がvoidの関数には現れません。式のないreturnステートメントは、戻り値の型がvoidの関数にのみ表示されます。

(式がvoidと評価される場合でも)

15
Mohit Jain

C++では次のようなことができます。

void f() 
{
    return void();
}

Cはしませんが。そのため、ISO C++ではなくISO Cをコンパイルすると警告が発行されます。これは正式に次のように記述されます:

Void型の式を持つreturnステートメントは、cv voidの戻り型を持つ関数でのみ使用できます

5
edmz

ISO/IEC 9899:201x委員会草案は次のように述べています。

6.8.6.4 returnステートメント

制約

  1. を含むreturnステートメントは、戻り型がvoidである関数には現れません。

    式のないreturnステートメントは、戻り型がvoidである関数にのみ表示されます。

したがって、Cでは禁止されています。


標準違反について文句を言うには、-pedanticスイッチをgccに切り替える必要があります。

test.c: In function ‘f2’:
test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
            [-Wpedantic]
     return f();
3
Antti Haapala

標準Cはこの構造をサポートしていません。

C11 6.8.6.4:returnステートメント

制約

1式を含むreturnステートメントは、戻り型がvoidである関数には表示されません。式のないreturnステートメントは、戻り型がvoidである関数にのみ表示されます。

質問の特別な場合には特別な規定は追加されません。一部のCコンパイラはこれを拡張機能としてサポートしています(C標準のいずれかに準拠するように指示されていない限り、gccはサポートしています)が、C11以前のバージョンでは制約違反と見なされます。

1
chqrlie