【发布时间】:2017-06-11 20:21:20
【问题描述】:
我正在尝试在没有任何 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 库会做一些工作,然后调用“main”函数并使用从 main 函数返回的值调用 ExitProcess(或类似的东西)。
在我的代码中,我没有使用 CRT 库,_main 仍然是程序的入口点(并且没有调用“main”函数)。
【问题讨论】:
-
使用
return变体是可移植代码,因此应该是首选。 -
@πάνταῥεῖ - 这个不便携的变体,这个错误的变体
-
还需要查看exit和_exit。
-
@πάνταῥεῖ:许多“便携”的东西依赖于 CRT,并且在标准库被禁用时根本无法工作。
-
Raymond Chen 在他的博客上回答了这个问题:blogs.msdn.microsoft.com/oldnewthing/20100827-00/?p=13023