当前位置:  开发笔记 > 编程语言 > 正文

在C/C++程序中,系统(windows,linux,mac OS X)如何调用main()函数

如何解决《在C/C++程序中,系统(windows,linux,macOSX)如何调用main()函数》经验,为你挑选了3个好方法。

我正在寻找一个更技术性的解释然后OS调用该函数.任何人都可以帮助我或指向我的网站或书籍吗?



1> Will Dean..:

.exe文件(或其他平台上的等效文件)包含"入口点"地址.对于第一个近似值,OS将.EXE文件的相关部分加载到ram中,然后跳转到入口点.

正如其他人所说的那样,这个入口点不是'main',而是成为运行时库的一部分 - 它会做一些事情,比如初始化静态对象,设置argc/argv参数,设置stdin/stdout/stderr完成所有这些后,它将调用你的main()函数.当主要退出时,运行时会经历一个将返回代码传递回环境,调用静态析构函数,调用_atexit例程等的类似过程.

如果您有MS工具(可能不是免费赠送的工具),那么您拥有所有运行时源,并且一种简单的方法来查看它是在main()方法的右括号上放置一个断点,并单步备份进入运行时.



2> Vincent Robe..:

main()是C库的一部分,不是系统功能.我不知道OS X或Linux,但Windows通常会启动一个程序WinMainCRTStartup().此符号初始化您的进程,提取命令行参数和环境(argc, argv, end)以及调用main().它还负责调用任何应该运行的代码main(),比如atexit().

通过查看Visual Studio文件,您应该能够找到默认实现,WinMainCRTStartup以查看它的作用.

您还可以定义自己的函数以在启动时调用,这可以通过更改链接器选项中的"入口点"来完成.这通常是一个不带参数并返回void的函数.



3> Anders..:

就Windows而言,入口点功能是:

安慰: void __cdecl mainCRTStartup( void ) {}

GUI: void __stdcall WinMainCRTStartup( void ) {}

DLL: BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}

在普通的main/WinMain/DllMain上使用这些的唯一原因是你想要使用自己的运行时库(如果你想要更小的文件大小或自定义功能)

对于自定义运行时实现和其他获取较小PE文件的技巧,请参阅:

http://www.microsoft.com/msj/archive/S569.aspx

http://www.codeproject.com/KB/tips/aggressiveoptimize.aspx

http://www.catch22.net/tuts/minexe.asp

http://www.hailstorm.net/papers/smallwin32.htm

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有