为什么SDL定义主macros?

在设置SDL时遇到了一些麻烦,我发现SDL定义了一个替代main的macros:

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

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

这个macros只是当我看到它的时候让我头痛…为什么SDL需要重新定义main? 经过一番search之后,我发现一些人#undef main ,并以正常的方式使用它。

所以这是一个问题: SDL为什么需要重新定义main,它是做什么的? 是否有任何副作用来定义它?

我注意到的一件事是,SDLredirect到文件的标准输出和错误(我不希望这种行为),这种行为停止,如果我取消定义主。

根据SDL Windows常见问题解答 :

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

如果由于某种原因需要使用WinMain() ,请查看src/main/win32/SDL_main.c中的SDL源代码,以了解在WinMain()函数中需要执行什么types的初始化,以便SDL能够工作正常。

SDL需要初始化,所以它会注入自己的main函数,在调用“main”函数之前运行它的初始化函数,重命名为SDL_main这样它就不会与实际的main函数冲突。 正如常见问题中所述,您的mainfunction必须是forms

 int main(int argc, char* argv[]) 

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