在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式,即使它是void
types。
从同一文件的前言:
第二版的主要变化包括:
[…]
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
函数中不允许return
expression式)
和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和以前的版本认为这是违反约束的。