请考虑以下代码段:
void f(void);
void g(…)
{
…
return f();
…
}
根据C11,这个return f();
是否有效?
我并不主张使用这种模式:如果它完全有效,它显然等同于f(); return;
(如果return;
本身在函数{{1 }})。我在C程序的静态分析的上下文中提出这个问题,其中C代码已经由其他人编写,问题在于根据标准判断它是否有效。
我认为C11 6.8.6.4:1意味着它是非标准的并且应该被静态拒绝。是否有可能以不同的方式解释它(我在实际和其他高质量的源代码中找到了这种模式)?
约束
带有表达式的return语句不应出现在返回类型为void的函数中。不带表达式的return语句只能出现在返回类型为void的函数中。
答案 0 :(得分:18)
return
之后的任何内容都是表达式。
Syntax ... return expressionopt;
标准说:
带有表达式的返回语句不应出现在返回类型的函数中 是无效的。 ....
f()
也是这里的一个表达。编译器应该发出警告
[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]
答案 1 :(得分:10)
这显然违反了约束条款,特别是考虑到
6.3.2.2 void:void表达式(具有void类型的表达式)的(不存在)值不得以任何方式使用,
这意味着不完整类型void
是一个死胡同,不能为任何目的重复使用。
答案 2 :(得分:0)
它明确指出A return statement without an expression shall only appear in a function whose return type is void
,尝试执行此操作:
void g()
{
return; // does not return any expression at all
}
void f()
{
return g();
}
int main(void) {
f();
return 0;
}