在OS X上,SDL使用预处理技巧来重载main()函数,并使用Objective C编写自己的入口点,以调用用户的main()函数。
这些技巧使得非C语言的SDL用户(例如:Haskell绑定)非常困难。
这样做有什么好处吗?
为什么SDL不能在SDL_init()函数中完成Objective-C Cocoa初始化呢?
SDL_init
中,你需要将其作为可选子系统,以避免给不需要它的开发人员带来不便。
- 它正确地处理了控制反转,这是Mac OS X和其他应用程序框架通常操作的方式,同时保持了SDL例程的操作语义。SDL_init假设初始化完成后将返回调用者,但是如果你试图在SDL_init
中创建一个应用程序对象并在其中调用[app run]
以完成应用程序初始化和启动,你将永远无法返回。如果你没有在那里调用run
,你就必须创建一个单独的SDL函数来设置应用程序运行循环。这可能会使SDL库变得更加复杂。所选择的方法通过让框架首先处理所有应用程序设置,并从applicationDidFinishLaunching
调用SDL_main()
例程,避免了所有这些问题。
- 它使得将在Linux上编写的SDL演示转换到Mac OS X变得容易。你甚至不需要重命名main - 预处理器将main()
重命名为SDL_main()
就已经为你处理了!SDL_main.h
中的main的主要驱动力,我同意这是一种丑陋的hack。SDL_main.h
以删除以下行:#define main SDL_main
SDLMain.m
中删除以下内容:#ifdef main
# undef main
#endif
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
Non-NIB-Code & other changes: Max Horn <max@quendi.de>
Feel free to customize this file to suit your needs
*/
这对我来说就像是邀请你自己动手解决问题,如果这些无法满足你的需求,可以使用SDLMain.{h,m}
作为模板进行定制。如果你自己动手实现,你可以按照自己的意愿进行。事实上,你甚至可以使用HOC编写类似于SDLMain.m
的东西。但是,除非你很擅长HOC,否则我建议保持简单。