【问题标题】:GCC : Return statement from a void function in CGCC:从 C 中的 void 函数返回语句
【发布时间】:2017-03-22 05:51:30
【问题描述】:

void bar() 表示bar 不返回任何内容。我很想知道,如果void 什么都不返回,那么为什么编译器(GCC)在编译以下程序时没有给出任何警告或错误?

#include <stdio.h>

void foo (void)
{
        printf("In foo() function\n");
}

void bar (void)
{
        printf("In bar() function\n");
        return foo(); // Note this return statement.
}

int main (void)
{
        bar();
        return 0;
}

我已经使用gcc -Wall myprog.c 编译,它工作正常。

【问题讨论】:

  • 因为即使它什么也不返回,你仍然可以使用return 来中断函数。
  • @Havenard:你的评论没有意义。
  • 你使用哪个版本的 gcc? 5 之前的版本默认为自 18 年以来已经过时的非标准 C90。使用更新的版本或特定标准 C,即 C11 - 至少 C99。
  • 该代码被接受为扩展(它在 C++ 中有效),并且在非迂腐模式下不会打印任何警告,因为它似乎不太可能导致任何问题:您使用的是一致的返回foo 和 bar 的类型。

标签: c gcc void


【解决方案1】:

这个结构在 C99 中是不允许的:

return 不允许在返回值的函数中使用不带表达式的函数(反之亦然)

使用正确版本的标准合规性编译打开produces 一个适当的错误:

prog.c:11:16: 错误:ISO C 禁止用表达式“返回”,在函数返回 void [-Werror=pedantic]

return foo(); // Note this return statement.
       ^~~~~

至于为什么这适用于旧版本的 C,原来的 K&R 缺少 void 关键字,所以想要明确该函数不返回任何内容的程序员使用带有 #define VOID int 或类似的预处理器.当然,这个“穷人的void”允许返回int 值,因此您帖子中的代码将完美编译。我的猜测是,该标准的早期版本的作者不愿意填补这个漏洞,因为这将是一个突破性的变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2016-08-28
    • 2021-12-01
    • 2011-03-26
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多