52

在设置 SDL 遇到一些麻烦后,我发现 SDL 定义了一个宏来替换 main:

#define main SDL_main

// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

如果主函数没有定义argcandargv参数,这也会产生编译错误。

这个宏一看到就头疼……为什么SDL需要重新定义main?经过一番搜索,我发现有些人#undef main,并以正常方式使用它。

那么问题来了: 为什么 SDL 需要重新定义 main,它的作用是什么?取消定义有副作用吗?

我注意到的一件事是 SDL 将标准输出和错误重定向到文件(我不希望这种行为),如果我取消定义 main.

4

2 回答 2

54

根据SDL Windows 常见问题解答

即使您正在创建 Windows 应用程序,您也应该使用main()而不是,因为 SDL 提供了一个版本,该版本在调用您的主代码之前执行一些 SDL 初始化。WinMain()WinMain()

如果出于某种原因您需要使用WinMain(),请查看 SDL 源代码,src/main/win32/SDL_main.c了解您需要在函数中进行何种初始化,以WinMain()使 SDL 正常工作。

SDL 需要初始化,因此它会注入自己的main函数,该函数在调用“主”函数之前运行其初始化,并将其重命名为SDL_main不与实际main函数冲突。如常见问题解答中所述,您的main函数必须采用以下形式

int main(int argc, char* argv[])
于 2012-08-15T19:49:18.823 回答
12

虽然我同意这是一种奇怪的做法,但在某些情况下这是一个合理的解决方案,尽管它在很大程度上取决于平台。考虑到不同的平台有不同的入口点。Windows 通常是 WinMain,Linux 是主要的,与 Android 的交互发生在 Java 中,WinRT 使用 C++/CX 扩展,等等。程序入口点和 API 可能是非常特定于平台的,SDL 试图为您省去处理这些问题的麻烦。如果您只针对 Windows 并且 SDL 只是为了省去使用 WIN32 API 的麻烦,您可能不需要它。但是,如果您超越桌面,我认为您会发现它很有用。

于 2015-10-10T07:31:36.247 回答