为什么return语句适用于void作为C中的返回类型?

时间:2016-04-12 07:43:57

标签: c function return void c89

注意:我在代码块IDE上使用W​​indows 7和gcc编译器。

我发现所有形式的回报 如果返回类型,则可以使用语句 功能无效

例如:

void message() //If i skip this declaration still it works
main()
{
    message();
}
void message()
{
    return 5; //also return 5.0 and return a(some variable) also works
}

因为,void指的是'没有返回任何内容'那我们怎样才能在这里使用return语句。这是否意味着所有程序都返回无论是无效还是其他返回类型?

我将void作为返回类型的另一个查询:

如果我使用这个程序

main()
{
    printf("%d",message());
}

void message()
{
}

它将输出设为1,

并且没有给出错误

但如果我使用它,我会收到错误:

void message(); //when I use the declaration

main()
{
    printf("%d",message());
}

void message()
{

}

为什么会这样?

2 个答案:

答案 0 :(得分:5)

我对C89不是很确定,但在C11中,我可以在章节§6.8.6.4中看到

  

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

因此,您的代码违反了标准。

关于第二部分,

  • 虽然缺少声明,但由于现在过时的 type-defaults-to - int 属性,出现才能正常工作,但它实际上已调用undefined behavior,因为您提供的void类型为int参数。

  • 虽然有一个前向声明(返回类型为void),但由于返回类型不匹配,错误很明显。

答案 1 :(得分:3)

C11标准草案n1570在前言中说明如下:

  

第二版[即C99]的主要变化包括:

     

[...]

     

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

C89标准然后说如下:

  

约束

     

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

但是,没有提及关于在返回类型为而不是 void的函数中没有出现表达式的情况下禁止返回语句。

因此,从void返回值在C89中也不正确。

请注意,C11也不允许main()没有返回类型。但是,除非提供-pedantic-errors选项,否则GCC对许多这些边界情况都非常放松。