gpt4 book ai didi

macos - OS X 上的 Haskell SDL

转载 作者:行者123 更新时间:2023-12-04 12:25:18 25 4
gpt4 key购买 nike

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 代码的依赖关系,该代码专注于初始化 SDL 特定子系统(视频、音频、定时等),仅限于 SDL 专门设计用于使用的特定子系统。 IE。这样,SDL 就保持精益求精。
  • 它避免了为应用程序初始化引入新的特定于平台的子系统。不是每个人都想要 SDL 为 Mac 应用程序设置的基本应用程序对象和菜单,而且绝对不是——所以如果您打算将其放入 SDL_init ,您需要将其设为可选子系统,以免给不需要它的开发人员带来不便。
  • 它正确处理控制反转,这是 Mac OS X 和其他应用程序框架通常操作的方式,同时保持 SDL 例程的操作语义。 SDL_init 假定它会在初始化完成后返回给调用者,但如果您天真地尝试在 SDL_init 中创建应用程序对象并调用 [app run]在它上面完成初始化应用程序和启动,你永远不会回来。如果您没有调用 run在那里,您必须创建一个单独的 SDL 函数来设置应用程序运行循环。这可能会使 SDL 库变得相当复杂。所选择的方法避免了这一切,让框架首先处理所有设置的应用程序,然后调用 SDL_main()来自 applicationDidFinishLaunching 的例程.
  • 它可以轻松地将在 Linux 上编码的 SDL 演示转换为 Mac OS X。您甚至不必重命名 main - 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 专家,否则我会保持简单。

    关于macos - OS X 上的 Haskell SDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076892/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com