如果void类型函数什么都不返回会发生什么

What happens if void type function returns nothing?

本文关键字:什么 返回 void 类型 函数 如果      更新时间:2023-10-16

假设我们有这样的函数

void test() {return;}

这是正确的C代码吗?我刚刚在mingw中测试了它,编译器什么也没说,也是如此

void test() {return 1;}

所以我想我的编译器真的过时了。

在给定的情况下,在C/C++中应该发生什么?

编辑

return 1;向我发出警告。这是否意味着return;是正确的?

C++11(ISO/IEC 14882:2011)§6.6.3返回语句

不带表达式的返回语句只能用于不返回值的函数,即返回类型为void、构造函数或析构函数的函数。具有非void类型表达式的return语句只能在返回值的函数中使用

C11(ISO/IEC 9899:201x)§6.8.6.4返回语句

带有表达式的return语句不应出现在返回类型为void的函数中。没有表达式的返回语句只能出现在返回类型为void的函数中。

然而,C89/C90仅对其一半进行了限制:

C89/C90(ISO/IEC 9899:1990)§3.6.6.4返回语句

带有表达式的return语句不应出现在返回类型为void的函数中。

在C11转发部分,它列出了第三版(即C11)和第二版(即C99)中的所有主要更改。最后一个是:

第二版的主要变化包括:

--在返回值的函数中不允许无表达式返回(反之亦然反之亦然)

这意味着自C99以来,函数返回类型的约束变化发生了变化。

Void不返回任何内容,因此其明显的编译器不会执行任何操作。如果您想返回一个值,您必须定义类型,无论是int、指针节点等。

不带表达式的return语句是从返回void的函数返回的正确方法。

但是,如果您想在return语句中提供一个表达式,那么您应该考虑:

return (void)(expr);

这里,expr是您想要包含以具有side-effects的任何表达式。作为一个建议,如果你想为它的副作用放置一个语句,那么你应该把它放在return语句之前,如下所示:

expr;
return;