これは警告なしでコンパイルします。
これは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");
}
C11、6.8.6.4「return
ステートメント」:
式を含む
return
ステートメントは、戻り型がvoid
である関数には現れません。
No、void
タイプであっても式を使用できません。
同じドキュメントの序文から:
第2版の主な変更点は次のとおりです。
[...]
- 式を持たない
return
は、値を返す関数では許可されません(逆も同様)
したがって、これはC89-> C99(言語標準の第2版)からの変更であり、それ以来ずっとそうです。
C++ 14、6.6.3 "return
ステートメント":
非void型の式を持つreturnステートメントは、値を返す関数でのみ使用できます[...] void型の式を持つreturnステートメントは、cv voidの戻り型を持つ関数でのみ使用できます。式は、関数が呼び出し元に戻る直前に評価されます。
はい、式ifを使用できます。これはvoid型です(C++ 98以降有効)。
このコードはC++
がC
では許可されていません
From Return statement @ cppreference
Voidを返す関数では、式のタイプがvoidの場合、式を含むreturnステートメントを使用できます。
C11仕様ドラフトn1570のOTOH:
第2版の主な変更点:
値を返す関数で許可されていない式なしの戻り値(およびその逆)
(return
は、void
を返す関数では許可されていない式で)
および6.8.6.4が戻ります
式を含むreturnステートメントは、戻り値の型がvoidの関数には現れません。式のないreturnステートメントは、戻り値の型がvoidの関数にのみ表示されます。
(式がvoid
と評価される場合でも)
C++では次のようなことができます。
void f()
{
return void();
}
Cはしませんが。そのため、ISO C++ではなくISO Cをコンパイルすると警告が発行されます。これは正式に次のように記述されます:
Void型の式を持つreturnステートメントは、cv voidの戻り型を持つ関数でのみ使用できます
ISO/IEC 9899:201x委員会草案は次のように述べています。
6.8.6.4 returnステートメント
制約
式を含む
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();
標準Cはこの構造をサポートしていません。
C11 6.8.6.4:
return
ステートメント制約
1式を含む
return
ステートメントは、戻り型がvoid
である関数には表示されません。式のないreturn
ステートメントは、戻り型がvoid
である関数にのみ表示されます。
質問の特別な場合には特別な規定は追加されません。一部のCコンパイラはこれを拡張機能としてサポートしています(C標準のいずれかに準拠するように指示されていない限り、gcc
はサポートしています)が、C11以前のバージョンでは制約違反と見なされます。