SDL на OS X использует приемы препроцессора для перегрузки основной () с их собственной точкой входа, записанной в Objective C, который называет основное пользователя.
Эти приемы делают жизни non-C SDL пользователями (например: привязка Haskell) очень трудный.
Существует ли серьезное основание для этого?
Почему не мог SDL делать объективную-C инициализацию Какао в SDL_init?
Подход для Mac OS X мало чем отличается от подхода для других платформ, отличных от Linux (Windows, старый Mac, BeOS). Вы можете спросить самих разработчиков SDL, почему они сделали это таким образом, но я вижу несколько причин, по которым они, возможно, выбрали именно это:
SDL_init
, вам нужно будет сделайте ее дополнительной подсистемой, чтобы не доставлять неудобства разработчикам, которым она не нужна. SDL_init
и вызвать на нем [запуск приложения]
для завершения инициализации приложение и запуск, вы никогда не вернетесь. Если вы не вызывали там run
, вам пришлось бы создать отдельную функцию SDL для настройки цикла выполнения приложения. Это может немного усложнить библиотеку SDL.Выбранный подход позволяет избежать всего этого, позволяя фреймворку позаботиться обо всех настройках приложения в первую очередь и вызвать подпрограмму SDL_main ()
из applicationDidFinishLaunching
. 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, я бы все упростил.