[英]Haskell SDL on OS X
OS X上的SDL使用预处理器技巧使main()用自己的入口点重载,用Objective C编写,调用用户的main。
这些技巧使非C SDL用户(例如:Haskell绑定)的生命变得非常困难。
有这么好的理由吗?
为什么SDL不能在SDL_init中执行Objective-C Cocoa初始化?
Mac OS X的方法与其他非Linux平台(Windows,旧Mac,BeOS)的方法没有太大区别。 您可以向SDL开发人员询问他们为什么这样做,但我可以看到他们选择这样做的几个原因:
SDL_init
,你需要把它变成一个可选子系统所以不要给不需要它的开发人员带来不便。 SDL_init
创建一个应用程序对象并在其上调用[app run]
来完成初始化应用程序并启动,那么你永远不会返回。 如果你没有调用那里run
,你必须创建一个单独的SDL函数来设置应用程序运行循环。 这可能会使SDL库变得相当复杂。 选择的方法通过让框架首先处理所有应用程序设置,并从applicationDidFinishLaunching
调用SDL_main()
例程来避免所有这些。 main()
重命名为SDL_main()
为您完成这项工作! 我猜这些原因中的最后一个是SDL_main.h
重新定义main的主要驱动SDL_main.h
,我同意这是一个丑陋的黑客攻击。
如果您准备为您的库和应用程序放弃该级别的跨平台可移植性,我建议您只需修改SDL_main.h
即可删除以下行:
#define main SDL_main
并从项目中的SDLMain.m
中删除以下内容:
#ifdef main
# undef main
#endif
如果这样做,您甚至不需要重新编译SDL。 请注意, SDLMain.m
已经设置为在没有预处理程序的情况下调用SDL_main()
,而SDL中没有任何其他内容可以使用它,因此通过这种方式,您可以简单地提供SDL_main()
作为游戏的入口点。
如果你想走另一条路,自己接管main()
,你仍然想要摆脱#define main SDL_main
中的#define main SDL_main
黑客攻击,但SDL_main.h
,你还不会对#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.{h,m}
作为模型。 如果你自己动手,你可以做你想做的事! 就此而言,您可以使用HOC在Haskell中编写等效的SDLMain.m
,如果这是您想要的。 但是,除非你是HOC的高手,否则我会保持简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.