注意:我在代码块IDE上使用Windows 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()
{
}
为什么会这样?
答案 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对许多这些边界情况都非常放松。