在C和C ++中返回voidtypes
这个编译没有任何警告。
这是合法的C和C + +或只是在gcc和叮当工作?
如果这是合法的,那么C99之后的新事物呢?
void f(){ } void f2(){ return f(); } 更新
作为“雷克萨斯”build议我试过这个:
 $ gcc -Wall -Wpedantic -c xc xc: In function 'f2': xc:7:9: warning: ISO C forbids 'return' with expression, in function returning void [-Wpedantic] return f(); 
 $ clang -Wall -Wpedantic -c xc xc: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) 
更新
有人问这个build筑是如何帮助的。 那么语法糖或多或less。 这是一个很好的例子:
 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声明”: 
带有expression式的
return语句不应出现在返回types为void的函数中。
  不 ,您可能不会使用expression式,即使它是voidtypes。 
从同一文件的前言:
第二版的主要变化包括:
[…]
return不带expression式不允许返回值的函数(反之亦然)
所以这是从C89 – > C99(语言标准的第二版)的变化,并且从那以后一直如此。
  C ++ 14,6.6.3“ return语句”: 
具有非voidtypesexpression式的return语句只能在返回值的函数中使用[…]具有voidtypesexpression式的return语句只能用于返回types为cv的函数void; expression式在函数返回给调用者之前被评估。
是的 , 如果它是无效types(从C ++ 98开始有效),则可以使用expression式。
 此代码在C++允许,但在C不允许 
从Return statement @ cppreference
在返回void的函数中,如果expression式types为void,则可以使用带expression式的return语句。
OT11在C11规格草案n1570:
第二版的主要变化包括:
返回不带expression式不允许返回值的函数(反之亦然)
  (在返回void函数中不允许returnexpression式) 
和6.8.6.4返回
带有expression式的return语句不应出现在返回types为void的函数中。 没有expression式的return语句只能出现在返回types为void的函数中。
  (即使expression式评估为void ) 
C ++允许这样的事情:
 void f() { return void(); } 
虽然C不。 这就是为什么如果您编译为ISO C而不是ISO C ++时发出警告。 这正式形容为:
具有voidtypesexpression式的return语句只能用于返回types为cv void的函数
ISO / IEC 9899:201x委员会草案如下:
6.8.6.4返回语句
约束
带expression式的
return语句不应出现在返回types为void的函数中 。没有expression式的
return语句只能出现在返回types为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带有expression式的
return语句不应出现在返回types为void的函数中。 没有expression式的return语句只能出现在返回types为void的函数中。
 在这个问题上没有特殊的规定。 一些C编译器确实支持这个扩展(除非被指示符合C标准之一,否则gcc会这样做),但C11和以前的版本认为这是违反约束的。