【问题标题】:Why does int main() {} compile?为什么 int main() {} 编译?
【发布时间】:2010-09-06 12:57:07
【问题描述】:

(我使用的是 Visual C++ 2008)我一直听说 main() 是 必需的 来返回一个整数,但这里我没有输入 return 0; 并且它已编译有 0 个错误和 0 个警告!在调试窗口中,它说程序已经以代码 0 退出。如果这个函数被命名为 main() 以外的任何名称,编译器会抱怨说 'blah' 必须返回一个值。粘贴return; 也会导致错误出现。但是完全忽略它,它编译得很好。

#include <iostream>
using namespace std;

int main()
{
    cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}

这可能是 VC++ 中的错误吗?

【问题讨论】:

    标签: c++ return-value main


    【解决方案1】:

    3.6.1 主要功能

    ....

    2 实现不应预定义main 函数。该功能不得重载。它的返回类型应该是int,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

    int main() { /* ... */ }
    

    int main(int argc, char* argv[]) {
    /* ... */
    }
    

    ....并且它继续添加...

    5 main 中的 return 语句具有离开主函数(销毁任何具有自动存储持续时间的对象)并以返回值作为参数调用 exit 的效果。 如果控制到达main的末尾没有遇到return语句,效果就是执行return 0;

    试图找到 C++ 标准的在线副本,以便引用这段话I found a blog post that quotes all the right bits better than I could.

    【讨论】:

    • g++ 默认情况下会向您抛出错误。大多数其他编译器会“返回 0”
    • 如果您在 main() 中没有 return 语句,旧版本的 GCC 实际上会在某些情况下返回垃圾。
    • @wakingrufus,你使用的是什么版本的 g++?我得到了 sparkes 描述的正确行为。
    • 请注意,引用的标准是 C99,而不是 C89 或 C++98,但 MSVC 在用作 C 编译器时主要实现 C89 而不是 C99 或 C11。但是,您也可以查阅 Microsoft 文档 — 其中 void main(…) 被定义为 OK(在 C 中)。
    【解决方案2】:

    这是 C++ 语言标准的一部分。如果 main 中没有显式的 return 语句,则会为您生成一个隐式 return 0。

    【讨论】:

      【解决方案3】:

      我很确定 VC++ 只是插入一个 return 0 如果你没有在 main 函数中包含一个。函数也可能发生同样的事情,但在这些情况下,至少您会收到警告。

      【讨论】:

      • 从非 void 函数的末尾脱落是未定义的行为。只有 main 是特殊的,隐式返回。
      【解决方案4】:

      第 6.6.3/2 节声明-“从函数末尾流出等同于没有值的返回;这会导致返回值的函数出现未定义的行为。”。

      一个例子是下面的代码,它充其量在 VS 2010/g++ 上给出警告

      int f(){
         if(0){
            if(1)
               return true;
         }
      }
      
      int main(){
         f();
      }
      

      因此,正如前面的回复所指出的那样,'main' 是特殊的。

      【讨论】:

        猜你喜欢
        • 2012-01-30
        • 1970-01-01
        • 2016-06-22
        • 2015-11-07
        • 2016-04-18
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        相关资源
        最近更新 更多