gpt4 book ai didi

C++ Windows 返回与 ExitProcess

转载 作者:太空狗 更新时间:2023-10-29 23:35:11 25 4
gpt4 key购买 nike

我正在尝试在没有任何 CRT 库的情况下在 Windows 上创建简单的程序。

我有两个代码:

// compile without -lkernel32
int __stdcall _main() {
return 5;
}

// compile with -lkernel32
#include <windows.h>

void __stdcall _main() {
ExitProcess(5);
}

我正在使用 MinGW-w64 7.1.0 和这个 bash 脚本编译它们:

@echo off
del main.exe 2>nul
C:\Users\Michal\Downloads\mingw64\bin\g++ main.cpp -o main.exe -O3 -s -nostdlib -lkernel32
main.exe
echo %errorlevel%
pause

输出(退出代码)是一样的。(我使用的是 Windows 7 Pro 64 位)

什么代码比较好? (也许更好的问题是:为什么“返回”变体有效?)

编辑:

程序的入口点(默认由链接器预先设置)是 _main(通常 CRT lib 会做一些工作,然后调用“main”函数并使用从 main 函数返回的值调用 ExitProcess(或类似的东西))。

在我的代码中,我没有使用 CRT 库,_main 仍然是程序的入口点(并且没有调用“main”函数)。

最佳答案

您是正确的,为什么 return 版本有效是理解哪个版本更好的关键。

这里重要的是 main 不是 Windows 控制台应用程序的入口点。入口点在库代码中,它初始化内存,调用全局变量的构造函数,将命令行拆分为 argc/argv 格式,然后调用 main 保存返回值。

如果 main 确实返回,它返回调用 atexit 的库代码 - 静态变量的注册函数和析构函数,然后调用 ExitProcess .

因此实际上只有一种方法可以设置退出值,即调用 ExitProcess。但是你自己做会跳过库采取的清理操作——如果你调用 ExitProcess 然后析构函数不会被调用,你可能会在写入缓冲区中丢失数据。

当您在没有标准库的情况下构建时,构建/销毁的库操作不相关,并且显式调用 ExitProcess 几乎与返回相同。仍然有一个库提供的调用框架可以捕获您的返回值并调用 ExitThread 如果您不这样做,但是当没有 CRT 时它来自操作系统本身 (kernel32.dll)。正如 RmMb 指出的那样,这是一个重要的区别,因为其他线程不会被杀死;如果所有线程退出,进程将退出。

关于C++ Windows 返回与 ExitProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44488392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com