为什么SDL定义主宏?

时间:2012-08-15 19:42:20

标签: c++ sdl main

在设置SDL时遇到一些问题,我发现SDL定义了一个替换main的宏:

#define main SDL_main

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

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

当我看到它时,这个宏让我感到头痛......为什么SDL需要重新定义主?经过一番搜索后,我发现有些人#undef main,并以正常的方式使用它。

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

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

2 个答案:

答案 0 :(得分:37)

the SDL Windows FAQ

  

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

     

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

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

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

答案 1 :(得分:6)

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