【发布时间】:2014-04-25 21:09:56
【问题描述】:
考虑以下 sn-p:
void f(void);
void g(…)
{
…
return f();
…
}
这个return f();根据C11有效吗?
我不提倡使用这种模式:如果它完全有效,它显然等同于f(); return;(如果g() 位于函数的末尾,return; 本身将是多余的)。我在 C 程序的静态分析的上下文中提出这个问题,其中 C 代码已经由其他人编写,问题是根据标准确定它是否有效。
我会将 C11 6.8.6.4:1 解释为它是非标准的,应该被静态拒绝。是否有可能以不同的方式解释它(我在实际和其他高质量的源代码中发现了这种模式)?
约束
带有表达式的 return 语句不得出现在返回类型为 void 的函数中。没有表达式的 return 语句只能出现在返回类型为 void 的函数中。
【问题讨论】:
-
您使用的编译器是拒绝代码、安静地接受代码还是在接受时发出警告?代码曾经是 ISO C 吗?
-
@RayToal GCC 接受 al-Khwārizmī 的回答中的程序
-std=c11 -Wall没有窥视,但-pedantic导致诊断。 -
Clang 也使用
-Wpedantic发出警告:void function 'f' should not return void expression [-Wpedantic] -
GCC 仅使用
-pedantic进行诊断是一个很好的指标,表明这是一个符合标准的扩展。我认为这是为了与 C++ 兼容,其中 [stmt.return]/3 表示“带有 void 类型表达式的返回语句只能在返回类型为 cv void 的函数中使用;表达式在函数之前被评估返回给它的调用者。” -
C89 standard 中也出现了“带有表达式的返回语句不应出现在返回类型为 void 的函数中”这句话,因此编译器警告而不是生成静态错误的事实是可能只是一个务实的选择。
标签: c language-lawyer c11