αλεχολυτ Asked:2020-03-06 22:08:47 +0800 CST2020-03-06 22:08:47 +0800 CST 2020-03-06 22:08:47 +0800 CST 主函数返回的类型 772 在网站上的许多代码示例中,既有表单的条目,也有void main()程序int main()的主要功能条目。 哪一个是正确的,有什么区别? c++ 2 个回答 Voted Best Answer αλεχολυτ 2020-03-06T22:08:47+08:002020-03-06T22:08:47+08:00 语言标准要求强制存在两种可能的实现: 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),它会中断程序的执行并将传递的代码返回给调用者。 nick_n_a 2020-01-17T17:10:43+08:002020-01-17T17:10:43+08:00 这个问题是链接器问题,而不是编译器问题。 您需要了解 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——如果程序总是“被强制”中断——那么返回类型将不再发挥作用。
语言标准要求强制存在两种可能的实现:
也就是说,在这两种情况下,返回类型都是
int
. 但是,允许在特定编译器中存在其他选项:因此,返回的选项
int
在编译器的不同实现之间是可移植的,但void
不适用于那些。但特别是void main()
它受到Microsoft Visual C++ 编译器的支持。返回值
main
一般表示程序成功。如果一切顺利,则返回零 -return 0;
; 否则,您应该返回一些可以在调用程序的一侧处理的其他整数值。return 0;
允许不显式写入main
。在这种情况下,当退出该功能时0
将被暗示。类似的行为也适用于void
MS 版本。但是如果在有int
返回码的情况下可以通过显式返回return
,那么void main()
这个选项就不再起作用了:没错,您可以改用该函数
exit(0)
,它会中断程序的执行并将传递的代码返回给调用者。这个问题是链接器问题,而不是编译器问题。
您需要了解 main 是一个
_cdecl
函数,即 该函数不关心有多少参数,因为参考库看起来像这样那些。事实上,如果有
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
——如果程序总是“被强制”中断——那么返回类型将不再发挥作用。