【问题标题】:Void Function Returns Int and VoidVoid 函数返回 Int 和 Void
【发布时间】:2014-06-10 17:47:40
【问题描述】:

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

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

而且接下来的代码也能正常工作:

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

 void a(){
  return 5;
 }

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

二、为什么会编译?

【问题讨论】:

  • 确保以最大数量的警告和严格性进行编译。
  • 我怀疑第二个有效。
  • 仅仅因为你可以通过编译器挤压它并不意味着它是正确的。

标签: c++ c


【解决方案1】:

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

根据 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 标准。

【讨论】:

    【解决方案2】:

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

    您的编译器正在为未声明的函数提供“默认”原型:

    int func();
    

    这是一个接受任何参数并返回int的函数。这可能不是你想要的。你的编译器应该已经发出警告说它提供了一个默认的函数声明。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2012-01-09
      • 2023-01-28
      • 1970-01-01
      相关资源
      最近更新 更多