提问者:小点点

为什么SDL定义主宏?


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

#define main SDL_main

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

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

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

所以这就是问题:为什么SDL需要重新定义main,它是做什么的? 取消定义有什么副作用吗?

我注意到的一件事是,SDL将标准输出和错误重定向到文件(而且我不想要这种行为),如果我取消定义main,这种行为就会停止。


共2个答案

匿名用户

根据SDL Windows常见问题:

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

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

SDL需要初始化,因此它注入自己的main函数,该函数在调用您的“main”函数之前运行初始化,它将该函数重命名为SDL_main,这样它就不会与实际的main函数冲突。 正如FAQ中所指出的,main函数的形式必须是

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

匿名用户

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