为什么SDL定义主宏?

Tib*_*ibi 36 c++ program-entry-point sdl

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

#define main SDL_main

// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jam*_*lis 39

根据SDL Windows常见问题解答:

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

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

SDL需要初始化,因此它会main在调用"main"函数之前注入自己的函数来运行其初始化,它将重命名为"main"函数,SDL_main以便它不会与实际main函数冲突.如FAQ中所述,您的main功能必须符合表格

int main(int argc, char* argv[])
Run Code Online (Sandbox Code Playgroud)

  • 几乎每个库都需要初始化,但这对于如何执行它看起来很糟糕.+1无论如何. (26认同)
  • @DavidGrayson确实非常糟糕的练习,特别是如果你有两个图书馆这样做...在剧情中的巨大痛苦 (17认同)
  • 我可以编写自己的main()实现,而不是使用这个奇怪的SDL_main()函数吗?有一些东西(例如,stdout重定向)有点被推到我的喉咙,我不想要它. (2认同)
  • 同意大卫。此宏是C技术。C ++有许多明智的选择。 (2认同)
  • 我不仅同意 David 认为这是一种糟糕的做法,而且 SDL 有它自己的 SDL_init 初始化调用。据我回忆,SDLmain 中的初始化非常无用(如果我记得的话,会重定向控制台) (2认同)

小智 7

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

  • “超越桌面”——嘿!Linux 和 OsX 也是桌面的。 (2认同)