RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 794522
Accepted
αλεχολυτ
αλεχολυτ
Asked:2020-03-06 22:08:47 +0000 UTC2020-03-06 22:08:47 +0000 UTC 2020-03-06 22:08:47 +0000 UTC

主函数返回的类型

  • 772

在网站上的许多代码示例中,既有表单的条目,也有void main()程序int main()的主要功能条目。

哪一个是正确的,有什么区别?

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    αλεχολυτ
    2020-03-06T22:08:47Z2020-03-06T22:08:47Z

    语言标准要求强制存在两种可能的实现:

    • int main()
      
    • int main(int, char**)
      

    也就是说,在这两种情况下,返回类型都是int. 但是,允许在特定编译器中存在其他选项:

    它的类型应具有 C++ 语言链接,并且应具有声明的返回类型 type int,否则其类型是实现定义的。

    因此,返回的选项int在编译器的不同实现之间是可移植的,但void不适用于那些。但特别是void main()它受到Microsoft Visual C++ 编译器的支持。

    返回值main一般表示程序成功。如果一切顺利,则返回零 - return 0;; 否则,您应该返回一些可以在调用程序的一侧处理的其他整数值。return 0;允许不显式写入main。在这种情况下,当退出该功能时0将被暗示。类似的行为也适用于voidMS 版本。但是如果在有int返回码的情况下可以通过显式返回return,那么void main()这个选项就不再起作用了:

    error C2562: 'main': 'void' function returning a value
    

    没错,您可以改用该函数exit(0),它会中断程序的执行并将传递的代码返回给调用者。

    • 6
  2. nick_n_a
    2020-01-17T17:10:43Z2020-01-17T17:10:43Z

    这个问题是链接器问题,而不是编译器问题。

    您需要了解 main 是一个_cdecl函数,即 该函数不关心有多少参数,因为参考库看起来像这样

    push ecx; argv
    push eax; argc
    call _main
    pop ecx
    pop ecx
    push eax ; Код возрата
    call _exit ; И на выход с кодом возврата
    

    那些。事实上,如果有int main()函数,堆栈不会被破坏,函数根本不会看到 argv 和 argc。该函数void main(int argc, int argv)将接收这两个参数。

    由于支持转到 _main 签名,因此任何没有参数或具有 _cdecl 标签(如果编译器不禁止它)的函数都可以放在此签名上。要获得这样的签名,您需要指示使用旧签名,这是通过指示来完成的extern "C"(此指示存在于标准库中,这要归功于主要工作)。那些。可以滚动视图extern "C" int _cdecl main(...); int _cdecl main(...){}以及类似地void main(),int main(int argc)甚至long _cdecl main(...);,int _cdecl main(int argc, char** argv, int secparam1, int secparam2, int secparam3)

    现在关于返回类型。参考库期望 eax 收到结果。使用时void-程序可以返回将从eax返回的“垃圾”,从这个角度来看它int main()更好。但最近,程序的返回码没有在任何地方分析,所以如果函数返回“垃圾”——这很可能不会影响任何事情。

    如果您为批处理文件或软件包(例如,安装程序)编写,其中检查了返回代码,那么您需要编写int main()并返回所需的值。

    此外,还有一些函数exit terminate和异常处理程序会绕过程序main——如果程序总是“被强制”中断——那么返回类型将不再发挥作用。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5