Haskell SDL на OS X - PullRequest
       17

Haskell SDL на OS X

7 голосов
/ 19 июня 2010

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

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

Есть ли для этого веская причина?

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

1 Ответ

5 голосов
/ 23 июля 2010

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

  • Это сохраняет зависимости кода SDL, который ориентирован на инициализациюСпецифичные для SDL подсистемы (видео, аудио, синхронизация и т. Д.) Ограничены конкретными подсистемами, с которыми SDL специально разработан для работы.То есть, таким образом, SDL остается скудным и средним.
  • Это позволяет избежать необходимости вводить новую платформо-зависимую подсистему для инициализации приложения.Не всем нужны простые приложения и меню, которые SDL настраивает для приложений Mac, не слишком далеко - так что если вы собираетесь поместить его в SDL_init, вам нужно сделать его необязательнымподсистема, чтобы не доставлять неудобства разработчикам, которым она не нужна.
  • Она правильно обрабатывает инверсию управления, как обычно работают Mac OS X и другие прикладные среды, сохраняя при этом операционную семантику подпрограмм SDL.SDL_init предполагает, что он вернется к вызывающей стороне после завершения инициализации, но если вы попытались наивно создать объект приложения в SDL_init и вызвать [app run] для него, чтобы завершить инициализацию приложения и запуск, вы никогда не вернетесь.Если вы не вызывали 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 на Хаскеле, используя HOC, если вы этого хотите.Если, конечно, вы не одарены HOC, я бы оставил это просто.

...