전 처리기 매크로에서 플랫폼 / 컴파일러를 식별하는 방법은 무엇입니까?


115

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

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

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

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


3
다음은 OS 매크로 정의 목록 입니다.
OCaml 2012

속임수는 훨씬 더 잘 받아 들여지는 대답을 가지고 있습니다.
rubenvb

1
제안 된 중복은 같은 질문이 아닙니다. 이 질문은 운영 체제를 식별하는 것에 대해서만 묻는 반면,이 질문은 컴파일러 식별에 대해서도 묻습니다. 이는 매우 다른 것입니다.
JBentley

@JBentley 아직 받아 들여진 대답은 컴파일러를 언급하지도 않고 OS (그리고 하나의 "플랫폼")에 대해서만 이야기합니다. 속임수가 제공하는 것에 비해 끔찍한 대답은 말할 것도 없습니다.
rubenvb

1
@rubenvb 그런 다음 다른 질문을 주석으로 연결합니다. 더 나은 답변이 있다고해서 중복되지는 않습니다. 질문은 답변이 아니라 중복 여부를 결정하는 것입니다. 이 질문을 닫는 것은 우리가 질문의 컴파일러 관련 부분에 대해 좋은 답변을 얻을 수 없다는 것을 보장 할뿐입니다. 소위 "중복"은 대답 할 수 없습니다.
JBentley

답변:


133

대한 맥 OS :

#ifdef __APPLE__

들어 는 MinGW Windows에서 :

#ifdef __MINGW32__

들어 리눅스 :

#ifdef __linux__

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


2
__APPLE__OSX와 iOS를 구별 합니까 ?
gman

14
__APPLE__OS X 및 iOS 모두에 대해 설정됩니다. #include <TargetConditionals.h>내부 수 있습니다 . #ifdef __APPLE__그러면 TARGET_OS_IPHONE #define.
Ted Mielczarek 2011-08-18

2
__MINGW64__하나 개의 용도는 mingw64 경우도 가능합니다
스콘

2
이후 __MINGW64__참조, 생각 _MSC_VER의 Windows / MSVC 가치 (도 MSVC 버전을 확인하는 데 사용할 수 있습니다) 언급이 때문이다.
ideasman42

죄송합니다.이 답변은 모든 계정에서 매우 정확하지 않으며 질문에도 답변하지 않습니다.
rubenvb

59

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

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


5
버전 1.55부터 Predef는 이제 Boost C ++ Libraries에 포함됩니다 .
rvalue

이 글을 올렸을 때 규칙이 다르다는 것을 알고 있지만 더 관련성있는 세부 정보를 포함하도록이 글을 수정하도록 요청해야합니다. 이제 하루 링크 전용 답변은 강력히 권장하지 않으며 제거하기 전에이 게시물을 저장할 수있는 기회를 제공하고 싶습니다.
Mick MacCallum 2014

1
이것이 제목에 명시된 질문에 실제로 대답하는 유일한 답변이며 질문이 매우 일반적이고 관련성이 있으므로 제거하지 않는 것이 좋습니다. 나는 그것을 "링크 전용"답변이라고 부르지 않을 것입니다.
hobb 2014

2
@ 0x7fffffff : 다른 답변의 내용을이 답변에 복제하면 누구에게 어떤 이점이 있을까요? 하나의 확실한 답을 갖는 것이 정말로 중요하다고 생각한다면, 아마도 그러한 답을 직접 만들어야 할 것입니다 (단단해서는 안됩니다 : 기존 답을 합리적인 순서로 붙이기 만하면됩니다). 개인적으로 나는 내 시간과 관련하여 더 좋은 일이 있지만 중재자로서 분명히 SO가 나보다 당신에게 더 중요합니다.
John Bartholomew

47

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

#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를 직접 사용하십시오.


4
대신 __linux __를 사용하십시오. GNU 확장이 비활성화 된 GCC (예 : -std = c ++ 0x)로 컴파일 할 때 linux가 정의되지 않습니다.
Erbureth는 Reinstate Monica

1
@Erbureth 고정되었지만 가장 높은 등급의 답변으로 predef.sourceforge.net/index.php를 사용해야합니다.
rubenvb

@rubenvb : 참으로. 그리고 그것은 여전히 ​​너무 적은 표를 얻었습니다. 나는 생각합니다. :) ... 나는 그들의 사이트를 너무 많이 찾았습니다.
0xC0000022L

일관성을 위해 (아마 약간 현명한) : #if정의 된 경우 첫 번째 질문, 다른 질문은 가치를 테스트합니다. 더 일관되게 할 수 있다면 #elif defined(__unix__) 등을 생각합니다.
leonbloy

20

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

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

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif

이것이 향상이라는 점을 감안할 때이 솔루션은 다른 플랫폼 / OS 및 다른 컴파일러에서 작동합니다.
트레버 보이드 스미스

3
"부스트 라이브러리를 충분히 강력하게 사용하는 것이 좋습니다 ...." -Boost를 세 번 평가했습니다. 평가를 통과 할 수 없습니다 ... 대부분의 버그 보고서는 인정되면 운이 좋았습니다. 인정의 부족은 엔지니어링 프로세스의 더 깊은 문제를 의미합니다. 전 처리기 매크로와 내장 된 C ++ 표준 라이브러리가 더 안전한 선택이라고 생각합니다.
jww
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.