空值返回函数g可以返回f(); 当f返回void?
请考虑以下代码段:
void f(void); void g(…) { … return f(); … }
这是return f();
根据C11有效吗?
我并不主张使用这种模式:如果它起作用,它显然等同于f(); return;
f(); return;
( return;
如果它在函数g()
的末尾,则本身将是多余的)。 我在C程序的静态分析的上下文中问这个问题,其中C代码已经由其他人编写,问题是根据标准判断它是否有效。
我认为C11 6.8.6.4:1意味着它是非标准的并且应该被静态拒绝。 是否有可能以不同的方式解释它(我在实际和其他高质量的源代码中找到了这种模式)?
约束
带有表达式的return语句不应出现在返回类型为void的函数中。 不带表达式的return语句只能出现在返回类型为void的函数中。
return
后的任何东西都是表达式。
6.8.6:1跳转语句
句法 ... 返回表达式opt ;
标准说:
带有表达式的 return语句不应出现在返回类型为void的函数中。 ….
f()
也是这里的一个表达式。 编译器应该发出警告
[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]
这显然是违反约束的行为,特别是考虑到这一点
6.3.2.2 void:void表达式(具有void类型的表达式)的(不存在)值不得以任何方式使用,
这意味着不完整类型的void
是一个死胡同,不能为任何目的重复使用。
它清楚地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; }