GCC: 在C语言中从void函数返回一个值

4

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
@Havenard:您的评论没有意义。 - too honest for this site
你使用的gcc版本是哪个?5版本之前的默认为非标准C90,这已经过时18年了。请使用更近期的版本或指定标准C,例如C11 - 至少C99。 - too honest for this site
1
代码被接受为扩展(在C++中有效),并且在非严格模式下没有打印任何警告,因为它似乎不太可能引起任何问题:您正在为foo和bar使用一致的返回类型。 - Marc Glisse
1个回答

6

在C99标准中,这种结构被禁止使用:

函数返回值时不允许使用没有表达式的return(反之亦然)。

使用正确版本的标准编译,会产生适当的错误提示:

prog.c:11:16: error: ISO C forbids ‘return’ with expression, in function returning void [-Werror=pedantic]

return foo(); // Note this return statement.
       ^~~~~
关于为什么旧版的C语言可以使用这个方法,原始的K&R没有void关键字,所以想要明确函数不返回任何东西的程序员会使用预处理器和#define VOID int或类似的方法。当然,这种“穷人版的void”允许返回一个int值,所以你帖子中的代码完全可以编译。我猜测早期标准的作者们不愿意修补这个漏洞,因为这将是一项破坏性的变更。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接