编译时没有任何警告。
这在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");
}
答案 0 :(得分:71)
C11 ,6.8.6.4“return
声明”:
带有表达式的
return
语句不应出现在返回类型为void
的函数中。
否,您可能不会使用表达式,即使它是void
类型。
从同一文件的前言:
第二版的主要变化包括:
[...]
return
没有表达式,在函数中不允许返回值(反之亦然)
所以这是对C89的改变 - > C99(语言标准的第二版),从那时起就一直如此。
C ++ 14 ,6.6.3“return
声明”:
表达式为非void类型的return语句只能用于返回值的函数[...] 表达式为void的return语句只能在返回类型为cv的函数中使用 无效;在函数返回其调用者之前计算表达式。
是,您可以使用表达式如果它是无效类型(自C ++ 98以来一直有效)。
答案 1 :(得分:14)
此代码在C++
中允许,但在C
来自Return statement @ cppreference
在返回void的函数中,带有表达式的return语句可以 如果表达式类型为void,则使用。
OTO在C11规范草案n1570:
第二版的主要变化包括:
在返回a的函数中不允许表达式返回 价值(反之亦然)
(return
在函数中不允许使用表达式返回void
)
和6.8.6.4返回
带有表达式的return语句不应出现在函数中 其返回类型为void。没有表达式的return语句 只应出现在返回类型为void的函数中。
(即使表达式评估为void
)
答案 2 :(得分:5)
C ++允许这样的东西:
void f()
{
return void();
}
虽然C没有。这就是为什么在编译ISO C而不是ISO C ++时发出警告的原因。这被正式描述为:
表达式为void的return语句只能用于 函数的返回类型为cv void
答案 3 :(得分:3)
ISO / IEC 9899:201x委员会草案说明如下:
6.8.6.4返回声明
约束
带有表达式的
- 的函数中。
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();
答案 4 :(得分:1)
标准C不支持这种结构:
C11 6.8.6.4:
return
声明约束
1带有表达式的
return
语句不应出现在返回类型为void
的函数中。没有表达式的return
语句只能出现在返回类型为void
的函数中。
对于问题中的特殊情况,没有添加任何特殊规定。一些C编译器确实支持这作为扩展(gcc
,除非指示符合C标准之一),但C11和以前的版本认为它是违反约束。