Void函数返回Int和Void

时间:2014-06-10 17:47:40

标签: c++ c

我尝试用返回类型编写一个void函数,并且由于某种原因可以正常工作。 这是我试图编译的一些代码:

void a(){
  return b();
}
void b()
{
   printf("%s","void:)");
}

下一个代码也能正常工作:

 int main()
 {
  a();
  return 0;
 }

 void a(){
  return 5;
 }

根据标准,上述哪一项是正确的?

其次,为什么要编译?

2 个答案:

答案 0 :(得分:3)

  

根据标准,上述哪一项是正确的?

根据C和C ++标准,两者都不正确。 C标准说:

6.8.6.4返回声明:

  

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

另请阅读此answer以获取更详细的说明。

  

其次,为什么要编译?

编译不保证您的代码不会产生错误。它可以。最好使用最大警告标志编译代码。我使用以下选项编译了第二个代码并得到以下警告:

In function 'main':
    [Warning] implicit declaration of function 'a' [-Wimplicit-function-declaration]
At top level:
    [Warning] conflicting types for 'a' [enabled by default]
    [Note] previous implicit declaration of 'a' was here
In function 'a':
    [Warning] 'return' with a value, in function returning void [enabled by default]  

虽然编译了代码,但存在一些错误并违反了C标准。

答案 1 :(得分:1)

两个程序无效。在b()中调用它之前,您未能在第一个程序中提供a()的函数定义或声明,并且在a()中调用它之前未能提供main()的函数定义在第二个程序中。

您的编译器正在提供"默认"未申报职能的原型:

int func();

这是一个以任何参数并返回int的函数。这可能不是你想要的。您的编译器应该发出警告,说它正在提供默认函数声明。

如果正确地向前声明函数(void b();void a();),编译器将正确拒绝这两个程序。