전 처리기 매크로에서 플랫폼 / 컴파일러를 식별하는 방법은 무엇입니까? Mac OS에서 컴파일해야하는 크로스 플랫폼 코드를 작성

Linux, Windows, Mac OS에서 컴파일해야하는 크로스 플랫폼 코드를 작성 중입니다. Windows에서는 Visual Studio와 mingw를 지원해야합니다.

#ifdef .. #endif환경에 배치해야하는 플랫폼 별 코드가 몇 가지 있습니다. 예를 들어, 여기에 win32 특정 코드를 배치했습니다.

#ifdef WIN32
#include <windows.h>
#endif

그러나 Linux 및 Mac OS를 어떻게 인식합니까? 사용해야하는 정의 이름 (또는 기타)은 무엇입니까?



답변

대한 맥 OS :

#ifdef __APPLE__

들어 는 MinGW Windows에서 :

#ifdef __MINGW32__

들어 리눅스 :

#ifdef __linux__

다른 Windows 컴파일러를 들어, 확인 이 스레드 다른 여러 컴파일러와 아키텍처.


답변

참조 : http://predef.sourceforge.net/index.php

이 프로젝트는 #defines많은 운영 체제, 컴파일러, 언어 및 플랫폼 표준, 표준 라이브러리에 대해 사전 정의 된 합리적으로 포괄적 인 목록을 제공합니다 .


답변

내가 사용하는 것은 다음과 같습니다.

#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
    // Windows (x64 and x86)
#elif __unix__ // all unices, not all compilers
    // Unix
#elif __linux__
    // linux
#elif __APPLE__
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif

편집 : 위의 내용이 기본적으로 작동 할 수 있지만 Boost.Predef 참조 페이지를 살펴보고 확인하려는 매크로를 확인하는 것을 잊지 마십시오 . 또는 Boost.Predef를 직접 사용하십시오.


답변

C ++를 작성하는 경우 Boost 라이브러리를 충분히 강력하게 사용하는 것이 좋습니다 .

최신 버전 (1.55)에는 수십 개의 다른 플랫폼 및 아키텍처 인식 매크로와 함께 원하는 것을 정확히 다루는 새로운 Predef 라이브러리가 포함되어 있습니다 .

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif


답변