C 프리프로세서에서 Mac OS X, iOS, Linux, Windows를 신뢰성 있게 검출하는 방법
Mac OS X, iOS, Linux, Windows에서 컴파일해야 하는 크로스 플랫폼 C/C++ 코드가 있는 경우, 프리프로세서 프로세스 중에 어떻게 이러한 코드를 확실하게 검출할 수 있습니까?
대부분의 컴파일러에서 사용되는 미리 정의된 매크로가 있습니다.목록은 여기서 찾을 수 있습니다.여기에서는 GCC 컴파일러의 사전 정의된 매크로를 확인할 수 있습니다.gcc의 예를 다음에 나타냅니다.
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
// iOS, tvOS, or watchOS Simulator
#elif TARGET_OS_MACCATALYST
// Mac's Catalyst (ports iOS API into Mac, like UIKit).
#elif TARGET_OS_IPHONE
// iOS, tvOS, or watchOS device
#elif TARGET_OS_MAC
// Other kinds of Apple platforms
#else
# error "Unknown Apple platform"
#endif
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
정의된 매크로는 사용하는 컴파일러에 따라 달라집니다.
그_WIN64
#ifdef
에 네스트 할 수 있습니다._WIN32
#ifdef
왜냐면_WIN32
는 Windows x64 버전을 대상으로 하는 경우에도 정의되어 있습니다.이것에 의해, 일부의 헤더에 포함되는 것이 양쪽 모두에 공통인 경우에, 코드의 중복을 방지할 수 있습니다(또,WIN32
IDE는 언더스코어 없이 올바른 코드 파티션을 강조 표시할 수 있습니다).
제이크가 지적했듯이TARGET_IPHONE_SIMULATOR
의 서브셋입니다.TARGET_OS_IPHONE
.
또한.TARGET_OS_IPHONE
의 서브셋입니다.TARGET_OS_MAC
.
따라서 더 나은 접근법은 다음과 같습니다.
#ifdef _WIN64
//define something for Windows (64-bit)
#elif _WIN32
//define something for Windows (32-bit)
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_OS_SIMULATOR
// define something for simulator
// (although, checking for TARGET_OS_IPHONE should not be required).
#elif TARGET_OS_IPHONE && TARGET_OS_MACCATALYST
// define something for Mac's Catalyst
#elif TARGET_OS_IPHONE
// define something for iphone
#else
#define TARGET_OS_OSX 1
// define something for OSX
#endif
#elif __linux
// linux
#elif __unix // all unices not caught above
// Unix
#elif __posix
// POSIX
#endif
위의 체크는TARGET_OS_SIMULATOR
매크로 이유는TARGET_IPHONE_SIMULATOR
iOS 14 이후 매크로가 사용되지 않게 되었습니다.
2021년 1월 5일: @Sadap의 코멘트에 의한 링크 갱신.
결과적으로 이 사이트의 사람들은 모든 OS/컴파일러 쌍에 대해 정의된 매크로의 표를 만드는 데 시간을 들였습니다.
예를 들어 다음과 같이 표시됩니다._WIN32
는 Windows with Cygwin(POSIX)에서는 정의되어 있지 않습니다.단, 이용 가능한 모든 컴파일러(Clang, GNU, Intel 등)에서 Windows, Cygwin(비 POSIX) 및 MinGW에서 컴파일을 하도록 정의되어 있습니다.
어쨌든, 저는 이 테이블이 꽤 유익하다는 것을 알았고, 여기서 같이 써야겠다고 생각했습니다.
언급URL : https://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor
'programing' 카테고리의 다른 글
새로운 메서드를 php 오브젝트에 즉시 추가하는 방법은? (0) | 2023.01.10 |
---|---|
Matplotlib에서 선의 개별 점에 대한 표식기 설정 (0) | 2023.01.10 |
Programming Error: 스레드에서 생성된 SQLite 개체는 동일한 스레드에서만 사용할 수 있습니다. (0) | 2023.01.10 |
문자열에서 utf8이 아닌 문자 제거 (0) | 2023.01.10 |
mysql에 한 테이블에서 다른 테이블로 데이터를 삽입합니다. (0) | 2023.01.10 |