【问题标题】:Can a void-returning function g return f(); when f returns void?可以返回 void 的函数 g return f();当 f 返回 void 时?
【发布时间】: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


【解决方案1】:

return 之后的任何内容都是表达式。

6.8.6:1 跳转语句

句法 ... 返回表达式opt;

标准说:

带有表达式的返回语句不应出现在返回类型为 是无效的。 ....

f() 这里也是一个表达式。编译器应该发出警告

[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]

【讨论】:

  • 你说得对:我没有这么看,但是 6.8.6:1 中的语法清楚地表明 f() 应该被视为一个表达式:它不能是其他任何东西根据语法。
  • @PascalCuoq;是的。补充说。
【解决方案2】:

这显然是违反约束的,特别是考虑到

6.3.2.2 void:不得以任何方式使用 void 表达式(具有 void 类型的表达式)的(不存在的)值,

这意味着不完整的类型void 是一个死胡同,不能用于任何目的。

【讨论】:

    【解决方案3】:

    它明确指出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;
    }
    

    【讨论】:

    • 它为我编译并带有警告; 无关的返回值.
    • 对我来说代码是有效的,应该没有警告。
    • @al-Khwārizmī 即使你用-Wall编译?
    猜你喜欢
    • 2020-01-18
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2015-01-24
    • 2012-01-09
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多