OSX의 SDL은 프리 프로세서 트릭을 사용하여 main()을 사용자의 메인을 호출하는 Objective C로 작성된 고유 한 진입 점으로 오버로드합니다.하스켈 SDL on OS X
이러한 트릭은 non-C SDL 사용자 (예 : 하스켈 바인딩)의 삶을 매우 어렵게 만듭니다.
여기에는 정당한 이유가 있을까요?
왜 SDL이 SDL_init에서 C 코코아 초기화를 수행 할 수 없었습니까?
OSX의 SDL은 프리 프로세서 트릭을 사용하여 main()을 사용자의 메인을 호출하는 Objective C로 작성된 고유 한 진입 점으로 오버로드합니다.하스켈 SDL on OS X
이러한 트릭은 non-C SDL 사용자 (예 : 하스켈 바인딩)의 삶을 매우 어렵게 만듭니다.
여기에는 정당한 이유가 있을까요?
왜 SDL이 SDL_init에서 C 코코아 초기화를 수행 할 수 없었습니까?
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
에서 주를 재정의 한 주요 원인이라고 추측하고 있습니다.
당신이 당신의 라이브러리와 애플 리케이션을위한 크로스 플랫폼 이식성의 수준을 포기할 준비가 있다면, 단순히 다음 줄을 제거하려면 SDL_main.h
을 수정 좋을 것 다음을
#define main SDL_main
및 제거 프로젝트의 SDLMain.m
에서 :
#ifdef main
# undef main
#endif
당신은 당신이 할 경우 SDL을 다시 컴파일 할 필요가 없습니다. SDLMain.m
은 이미 전 처리기 해킹없이 SDL_main()
을 호출하도록 설정되어 있으며 SDL의 다른 항목에서는이 설정을 사용하지 않으므로이 방법으로 게임의 진입 점으로 SDL_main()
을 제공 할 수 있습니다.당신이 main()
을 통해 자신을 복용, 다른 길을 갈려면
, 당신은 여전히 SDL_main.h
에서 #define main SDL_main
해킹을 없애 싶어하지만, 다른 것보다, 당신은 SDL가 제공하는 main()
신세 아니에요 당신. 첫째, SDLMain.{h,m}
은 적절한 라이브러리의 일부가 아닙니다. 이를 프로젝트에 별도로 포함시켜야합니다. 둘째, SDLMain.h
에 다음과 같은 의견을 참고 : 초대장처럼 나에게 소리
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <[email protected]>
Non-NIB-Code & other changes: Max Horn <[email protected]>
Feel free to customize this file to suit your needs
*/
을 이러한 모델로 SDLMain.{h,m}
로 시작하는 당신을 위해 작동하지 않는 경우 자신의 롤 이동합니다. 그리고 자신 만의 압연을한다면, 원하는 것을 할 수 있습니다! 이 문제에 대해서는 HOCELL을 사용하여 Haskell에 SDLMain.m
에 해당하는 것을 쓸 수 있습니다. 당신이 HOC와 함께하는 숙련자가 아니라면, 나는 그것을 간단하게 유지할 것입니다.