OS X 上的 SDL 使用预处理器技巧用自己的入口点重载 main(),用 Objective C 编写,它调用用户的 main。
这些技巧使非 C SDL 用户(例如:Haskell 绑定(bind))的生活变得非常困难。
这有充分的理由吗?
为什么 SDL 不能在 SDL_init 中进行 Objective-C Cocoa 初始化?
请您参考如下方法:
Mac OS X 的方法与其他非 Linux 平台(Windows、旧 Mac、BeOS)的方法没有太大区别。您可以询问 SDL 开发人员自己为什么这样做,但我可以看到他们可能选择这样做的几个原因:
SDL_init
,您需要将其设为可选子系统,以免给不需要它的开发人员带来不便。 SDL_init
中创建应用程序对象并调用 [app run]
在它上面完成初始化应用程序和启动,你永远不会回来。如果您没有调用 run
在那里,您必须创建一个单独的 SDL 函数来设置应用程序运行循环。这可能会使 SDL 库变得相当复杂。所选择的方法避免了这一切,让框架首先处理所有设置的应用程序,然后调用 SDL_main()
来自 applicationDidFinishLaunching
的例程. main()
的预处理器重命名至SDL_main()
为您解决这个问题! 我猜这些原因中的最后一个是在
SDL_main.h
中重新定义 main 背后的主要驱动力。 ,我同意这是一个丑陋的黑客。
如果您准备为您的库和应用程序放弃那种级别的跨平台可移植性,我建议您只需修改您的
SDL_main.h
删除以下行:
#define main SDL_main
并从
SDLMain.m
中删除以下内容在您的项目中:
#ifdef main
# undef main
#endif
如果您这样做,您甚至不需要重新编译 SDL。请注意
SDLMain.m
已设置为调用
SDL_main()
没有预处理器 hack,SDL 中的其他任何东西都不会使用它,因此您可以通过这种方式简单地提供
SDL_main()
作为游戏的入口点。
如果你想走另一条路,接管
main()
你自己,你仍然想摆脱
#define main SDL_main
破解
SDL_main.h
,但除此之外,您不会受制于
main()
SDL 为您提供的。首先,请注意
SDLMain.{h,m}
不是图书馆本身的一部分;您必须将它们分别包含在您的项目中。其次,请注意
SDLMain.h
中的以下评论:
/* 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}
开始作为模特。如果你自己动手,你可以做你想做的事!就此而言,您可以写成
SDLMain.m
在 Haskell 中,使用 HOC,如果那是你想要的。不过,除非您是 HOC 专家,否则我会保持简单。