Nic*_*ick 65 c c++ gcc clang language-lawyer
这编译没有任何警告.
这在C和C++中是合法的还是只在gcc和clang中工作?
如果它是合法的,那么在C99之后它是新东西吗?
void f(){
}
void f2(){
return f();
}
Run Code Online (Sandbox Code Playgroud)
更新
正如"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();
Run Code Online (Sandbox Code Playgroud)
$ 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.
Run Code Online (Sandbox Code Playgroud)
$ gcc -Wall -Wpedantic -c x.cc
(no errors)
Run Code Online (Sandbox Code Playgroud)
$ clang -Wall -Wpedantic -c x.cc
(no errors)
Run Code Online (Sandbox Code Playgroud)
更新
有人问这个建筑是如何帮助的.好吧或多或少的语法糖.这是一个很好的例子:
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");
}
Run Code Online (Sandbox Code Playgroud)
Dev*_*lar 71
C11,6.8.6.4 "的return
声明":
return
带有表达式的语句不应出现在返回类型为的函数中void
.
不,您可能不会使用表达式,即使它是void
类型.
从同一文件的前言:
第二版的主要变化包括:
[...]
return
没有表达式,在函数中不允许返回值(反之亦然)
所以这是从C89 - > C99(语言标准的第二版)的变化,从那时起就一直如此.
C++ 14,6.6.3" return
声明":
带有非void类型表达式的return语句只能在返回值的函数中使用[...]带有void类型表达式的return语句只能在返回类型为cv void的函数中使用; 在函数返回其调用者之前计算表达式.
是的,你可以使用一个表达式,如果它是void类型(自C++ 98以来一直有效).
Moh*_*ain 15
允许使用此代码,C++
但不允许使用此代码C
在返回void的函数中,如果表达式类型为void,则可以使用带表达式的return语句.
OTO在C11规格草案n1570中:
第二版的主要变化包括:
返回没有表达式的返回不允许返回值的函数(反之亦然)
(return
在返回a的函数中不允许使用表达式void
)
和6.8.6.4返回
带有表达式的return语句不应出现在返回类型为void的函数中.不带表达式的return语句只能出现在返回类型为void的函数中.
(即使表达式评估为void
)
C++允许这样的东西:
void f()
{
return void();
}
Run Code Online (Sandbox Code Playgroud)
虽然C没有.这就是为什么如果你编译ISO C而不是ISO C++就会发出警告.这被正式描述为:
表达式为void的return语句只能在返回类型为cv void的函数中使用
归档时间: |
|
查看次数: |
9538 次 |
最近记录: |