2009-07-13 2 views
6

저는 iPhone, Windows, Linux, Mac 및 Symbian S60을 포함하여 상당히 다른 플랫폼에서 빌드 할 수 있어야하는 C++의 작은 라이브러리를 작성하고 있습니다. 대부분의 코드는 플랫폼에 독립적 이도록 작성했지만 플랫폼별로 작성해야하는 부분이 있습니다.플랫폼 C 전 처리기 정의

현재 현재 플랫폼에 따라 다른 헤더를 포함하여이 작업을 수행하고 있지만 모든 플랫폼에 대해 어떤 선행 프로세서 정의가 정의되어 있는지 모르기 때문에이 문제를 해결하는 데 문제가 있습니다. Windows의 경우 일반적으로 WIN32 또는 _WIN32를 사용합니다. Linux의 경우 _UNIX_에 의존 할 수 있지만 다른 플랫폼이나 64 비트 버전에 대해서는 확신이 없습니다. 누구나 플랫폼에있는 다른 정의 목록을 가지고 있습니까? 아니면 config 파일이나 gcc 매개 변수를 사용해야합니까?

답변

9

내 즐겨 찾기에 this sourceforge pre-compiler 페이지가 있습니다.

+0

Google이 항상 이전 버전을 가리 키지 만 훨씬 더 최신 인 새로운 wiki-ized 버전을 가리 키도록 링크를 편집했습니다. . – rubenvb

+0

괜찮습니다. 고마워요. –

0

C 또는 C++ 표준은 이러한 기호를 정의하지 않으므로 특정 C 또는 C++ 구현을 자비로 사용하게됩니다. 일반적으로 사용되는 기호 목록은 유용 할 수 있지만 불행히도 나는 가지고 있지 않습니다.

0

플랫폼의 범용 목록이 존재한다고 생각하지 않습니다. 필자가 본 모든 크로스 플랫폼 라이브러리에는 이러한 구성 요소로 가득 찬 ad-hoc config.h가 있습니다. 하지만 당신은 여기 libpng

0

정의는 순수 컴파일러 공급 업체까지있을 예정이 사용하는 하나

ZLIB 등의 libpng처럼 매우 휴대용 라이브러리가 사용하는 것을보고 고려할 수 있습니다. 모든 플랫폼에서 동일한 컴파일러 (예 : gcc)를 사용하는 경우 조금 더 쉬울 것입니다.

대부분의 .h 파일이 플랫폼에 종속되지 않도록 프로젝트를 구성 할 수도 있습니다. 구현 (cpp 파일)을 별도의 파일로 나눕니다. 하나는 비 특정 항목에 대한 것이고 다른 하나는 각 플랫폼에 대한 것입니다. 플랫폼 고유의 헤더는 해당 플랫폼에 대해서만 의미가있는 '개인용'헤더를 포함 할 수 있습니다. 시스템 라이브러리가 약간 다른 인수를 취할 때와 같이 100 % 작동하도록 어댑터 기능을 만들어야 할 수도 있지만 결국에는 도움이된다는 것을 알았고 새로운 플랫폼을 가져 오는 것이 훨씬 쉽습니다. 미래에.

0

당신은 GCC를 가지고있는 주어진 시스템에 대한 기본 처리기 기호를 통해보고 싶은 경우 (예를 들어, 맥 OS X는 아이폰 OS, 리눅스), 당신은 이렇게 명령 줄에서 전체 목록을 얻을 수 있습니다 :

echo 'main(){}' | cpp -dM 

그러나 이들은 대부분 사전 처리기가 작동하는 컴파일 단계에서 시스템의 운영 체제와 CPU 유형이 인 시스템 만 식별하므로 시스템이 아니라 컴파일러를 식별합니다 (예 : iOS 용 크로스 컴파일). 맥 OS X 및 iOS, 대상이되는 시스템의 컴파일시의 특성을 결정하는 올바른 방법에이 다음을 수행 할 수 있습니다 현재 사용중인 플랫폼과 SDK에서 TargetConditionals.h를 데리러 것

#include <TargetConditionals.h> 

입니다 엔디안 및 일부 매크로의 일부 특성을 결정합니다 (예 :). (당신이 수집 할 수있는 정보의 종류를 보려면 TargetConditionals.h를보십시오.)

+0

-dM 출력을 검사하는 것이 도움이 될 수 있지만, predef sourceforge wiki 페이지만큼 많은 정보를 보장 할 수는 없습니다. – rubenvb