Haskell SDL на OS X

SDL на OS X использует приемы препроцессора для перегрузки основной () с их собственной точкой входа, записанной в Objective C, который называет основное пользователя.

Эти приемы делают жизни non-C SDL пользователями (например: привязка Haskell) очень трудный.

Существует ли серьезное основание для этого?

Почему не мог SDL делать объективную-C инициализацию Какао в SDL_init?

7
задан Peaker 19 June 2010 в 19:16
поделиться

1 ответ

Подход для Mac OS X мало чем отличается от подхода для других платформ, отличных от Linux (Windows, старый Mac, BeOS). Вы можете спросить самих разработчиков SDL, почему они сделали это таким образом, но я вижу несколько причин, по которым они, возможно, выбрали именно это:

  • Это сохраняет зависимости кода SDL, который ориентирован на инициализацию специфичных для SDL подсистем (видео , звук, синхронизация и т. д.), ограниченные конкретными подсистемами, для работы с которыми специально разработан SDL. Т.е. Таким образом, SDL остается компактным и средним.
  • Это позволяет избежать необходимости вводить новую подсистему, зависящую от платформы, для инициализации приложений. Не всем понадобится простой объект приложения и меню, которые SDL настраивает для приложений Mac, и это далеко не все - поэтому, если вы собираетесь поместить его в SDL_init , вам нужно будет сделайте ее дополнительной подсистемой, чтобы не доставлять неудобства разработчикам, которым она не нужна.
  • Он правильно обрабатывает инверсию управления, как обычно работает Mac OS X и другие платформы приложений, сохраняя при этом операционную семантику подпрограмм SDL. SDL_init предполагает, что он вернется к вызывающей стороне после завершения инициализации, но если вы наивно попытались создать объект приложения в SDL_init и вызвать на нем [запуск приложения] для завершения инициализации приложение и запуск, вы никогда не вернетесь. Если вы не вызывали там run , вам пришлось бы создать отдельную функцию SDL для настройки цикла выполнения приложения. Это может немного усложнить библиотеку SDL.Выбранный подход позволяет избежать всего этого, позволяя фреймворку позаботиться обо всех настройках приложения в первую очередь и вызвать подпрограмму SDL_main () из applicationDidFinishLaunching .
  • Это упрощает преобразование демонстраций SDL, закодированных в Linux, в Mac OS X. Вам даже не нужно переименовывать main - препроцессор переименовывает main () в SDL_main () позаботится об этом за вас!

Я предполагаю, что последняя из этих причин является основной причиной переопределения 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 в 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, я бы все упростил.

5
ответ дан 7 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: