2010-06-19 3 views
7

OSX의 SDL은 프리 프로세서 트릭을 사용하여 main()을 사용자의 메인을 호출하는 Objective C로 작성된 고유 한 진입 점으로 오버로드합니다.하스켈 SDL on OS X

이러한 트릭은 non-C SDL 사용자 (예 : 하스켈 바인딩)의 삶을 매우 어렵게 만듭니다.

여기에는 정당한 이유가 있을까요?

왜 SDL이 SDL_init에서 C 코코아 초기화를 수행 할 수 없었습니까?

답변

5

Mac OS X의 접근 방식은 다른 비 Linux 플랫폼 (Windows, 구형 Mac, BeOS)과 크게 다르지 않습니다. 그들은 이런 식으로 왜 그랬는지 당신은 SDL 개발자들에게 스스로 질문을 할 수 있지만, 나는 그들이이해야 할 선택했을 수 있습니다 여러 가지 이유를 볼 수 있습니다

  • 이 SDL-특정 초기화에 초점을 맞추고 SDL 코드의 종속성을 유지를 SDL과 함께 작동하도록 특별히 설계된 특정 서브 시스템으로 제한된 서브 시스템 (비디오, 오디오, 타이밍 등). 나는. 이렇게하면 SDL은 간결하고 의미가 있습니다.
  • 응용 프로그램을 초기화 할 때 새로운 플랫폼 별 하위 시스템을 도입하지 않아도됩니다. 모든 사람들이 SDL이 Mac 앱용으로 설정 한 베어 본 애플리케이션 객체와 메뉴를 원한다는 것은 아닙니다. 따라서 SDL_init에 넣으 려한다면 선택적인 서브 시스템이되어야합니다. 불필요한 개발자에게는 불필요한 개발자가 아닙니다.
  • SDL 루틴의 운영 의미를 유지하면서 Mac OS X 및 다른 응용 프로그램 프레임 워크가 일반적으로 작동하는 방식 인 컨트롤의 반전을 올바르게 처리합니다. SDL_init은 초기화가 완료된 후에 호출자에게 반환 될 것이라고 가정하지만, SDL_init에 응용 프로그램 객체를 생성하고 응용 프로그램 초기화 및 실행을 완료하기 위해 [app run]을 호출하려고 시도하면 결코 반환되지 않습니다. run을 호출하지 않은 경우 별도의 SDL 함수를 만들어 응용 프로그램 실행 루프를 설정해야합니다. 이것은 SDL 라이브러리를 꽤 복잡하게 만들 수 있습니다. 프레임 워크가 먼저 모든 응용 프로그램을 설정하고 applicationDidFinishLaunching에서 SDL_main() 루틴을 호출하도록함으로써이 방법을 피할 수 있습니다.
  • Linux에서 작성된 SDL 데모를 Mac OS X로 쉽게 변환 할 수 있습니다. 주 이름을 바꾸지 않아도됩니다. 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와 함께하는 숙련자가 아니라면, 나는 그것을 간단하게 유지할 것입니다.