在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返回语句

约束

  1. 带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和以前的版本认为这是违反约束的。