정보

C++ 컴파일 타임에 플랫폼 확인

1. Windows 계열

Windows 계열은 C++ 컴파일러에서 _WINDOWS나 _WIN32, _WIN64, WIN32, WIN64 중 하나의 전처리기를 자동으로 등록한다. 이 중 하나라도 적용된 것이 있다면 Windows 계열용으로 컴파일한다는 말.

세부적인 플랫폼 체크는 Windows.h 헤더파일을 포함한 후 가능하다.

1.1. Windows Desktop

Windows Desktop는 WINAPI_FAMILY_PARTITION 매크로를 이용해 WINAPI_PARTITION_DESKTOP이 검출됐거나 WINAPI_FAMILY_DESKTOP_APP의 정의가 되지 않았다면 해당된다.

1.2. Windows RT(Windows 8(.1) Store App, Universal Windows App)

Windows App은 Windows Desktop으로 검출이 되지는 않았으나 WINAPI_FAMILY_PARTITION 매크로를 이용해 WINAPI_FAMILY_PC_APP이 검출됐다면 해당된다.

1.3. Windows Phone(Windows Phone 8(.1) App, Universal Windows App Mobile)

Windows Phone은 Windows Desktop으로 검출이 되지는 않았으나 WINAPI_FAMILY_PARTITION 매크로를 이용해 WINAPI_FAMILY_PHONE_APP이 검출됐다면 해당된다.

2. EMScripten

EMScripten은 C++ 컴파일러에서 EMSCRIPTEN 전처리기를 자동으로 등록한다.

3. Apple OS

Apple의 모든 OS는 C/Objective-C/Objective-C++ 컴파일러에서 __APPLE__ 전처리기를 자동으로 등록한다.

세부적인 플랫폼 체크는 TargetConditionals.h 헤더파일을 포함한 후 가능하다.

3.1. macOS(Mac OS X, OS X)

macOS는 TARGET_OS_MAC이 1이고 TARGET_OS_IOS나 TARGET_OS_SIMULATOR 등 다른 요소가 0이면 해당된다.

3.2. iOS(iPhoneOS)

iOS는 TARGET_OS_IOS나 TARGET_OS_SIMULATOR가 1이면 해당된다.

3.3. watchOS

watchOS는 TARGET_OS_WATCH가 1이면 해당된다.

3.4. tvOS

tvOS는 TARGET_OS_TV가 1이면 해당된다.

4. Android

Android는 C/C++ 컴파일러에서 __ANDROID__ 전처리기를 자동으로 등록한다.

5. UNIX(Linux)

UNIX 계열 OS는 C/C++ 컴파일러에서 __unix__, __linux__ 등의 전처리기를 하나 이상 자동으로 등록하며, 이 중 Android는 __ANDROID__ 전처리기가 같이 포함되기 때문에 __ANDROID__가 등록되지 않은 경우 PC용 UNIX 계열 OS라고 볼 수 있다.

6. 최종적으로 내가 원하는 코드

#if ( defined ( _WINDOWS ) || defined ( _WIN32 ) || defined ( _WIN64 ) || defined ( WIN32 ) || defined ( WIN64 ) )
# include <Windows.h>
# if WINAPI_FAMILY_PARTITION ( WINAPI_PARTITION_DESKTOP ) || !defined ( WINAPI_FAMILY_DESKTOP_APP )
# define NBPlatformWindowsNT 1
# define NBPlatformWindowsRT 0
# elif WINAPI_FAMILY_PARTITION ( WINAPI_FAMILY_PC_APP )
# define NBPlatformWindowsNT 0
# define NBPlatformWindowsRT 1
# include <wrl.h>
# include <wrl/client.h>
# endif
#else
# define NBPlatformWindowsNT 0
# define NBPlatformWindowsRT 0
#endif
#if defined ( EMSCRIPTEN )
# include <emscripten/emscripten.h>
# include <emscripten/html5.h>
# define NBPlatformWeb 1
#else
# define NBPlatformWeb 0
#endif
#if defined ( __APPLE__ )
# include <TargetConditionals.h>
# define NBPlatformOSX TARGET_OS_MAC && !( TARGET_OS_IOS || TARGET_OS_SIMULATOR )
# define NBPlatformiOS TARGET_OS_IOS || TARGET_OS_SIMULATOR
# import <Foundation/Foundation.h>
# if ( NBPlatformOSX )
# import <Cocoa/Cocoa.h>
# else
# import <UIKit/UIKit.h>
# endif
#else
# define NBPlatformOSX 0
# define NBPlatformiOS 0
#endif
#if defined ( __ANDROID__ )
# include <jni.h>
# include <android/api-level.h>
# include <android/native_activity.h>
# include <android/native_window.h>
# include <android/input.h>
# include <android/window.h>
# include <android/configuration.h>
# include <android/asset_manager.h>
# include <android/obb.h>
# include <android/looper.h>
# include <android/keycodes.h>
# include <android/sensor.h>
# include <android/storage_manager.h>
# include <android/log.h>
# define NBPlatformAndroid 1
#else
# define NBPlatformAndroid 0
#endif
#if ( defined ( __unix__ ) || defined ( __linux__ ) ) && !defined ( __ANDROID__ )
# define NBPlatformUNIX 1
#else
# define NBPlatformUNIX 0
#endif
광고
태그 지정됨

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.