IT-Swarm.Net

Làm thế nào để phát hiện đáng tin cậy Mac OS X, iOS, Linux, Windows trong bộ tiền xử lý C?

Nếu có một số mã C/C++ đa nền tảng cần được biên dịch trên Mac OS X, iOS, Linux, Windows, làm thế nào tôi có thể phát hiện chúng một cách đáng tin cậy trong quá trình tiền xử lý?

286
Eonil

Có các macro được xác định trước được sử dụng bởi hầu hết các trình biên dịch, bạn có thể tìm thấy danh sách tại đây . Có thể tìm thấy các trình biên dịch GCC được xác định trước tại đây . Đây là một ví dụ cho gcc:

#ifdef _WIN32
   //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 Simulator
    #Elif TARGET_OS_IPHONE
        // iOS device
    #Elif TARGET_OS_MAC
        // Other kinds of Mac OS
    #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

Các macro được xác định phụ thuộc vào trình biên dịch mà bạn sẽ sử dụng.

_WIN64#ifdef có thể được lồng vào _WIN32#ifdef_WIN32 được xác định khi nhắm mục tiêu Windows, không chỉ phiên bản x86. Điều này ngăn việc sao chép mã nếu một số bao gồm chung cho cả hai.

465
Evgeny Gavrin

Như Jake chỉ ra, TARGET_IPHONE_SIMULATOR là một tập hợp con của TARGET_OS_IPHONE.

Ngoài ra, TARGET_OS_IPHONE là tập hợp con của TARGET_OS_MAC.

Vì vậy, một cách tiếp cận tốt hơn có thể là:

#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_IPHONE_SIMULATOR
        // define something for simulator   
    #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
29
PatchyFog

Loại câu trả lời đầy đủ: những người trên [trang này] đã dành thời gian để tạo các bảng macro được xác định cho mọi cặp OS/trình biên dịch .

Ví dụ: bạn có thể thấy rằng _WIN32 KHÔNG được xác định trên Windows với Cygwin (POSIX), trong khi nó IS được xác định để biên dịch trên Windows, Cygwin (không phải POSIX) và MinGW với mọi trình biên dịch có sẵn (Clang, GNU, Intel, v.v.).

Dù sao, tôi thấy các bảng khá nhiều thông tin và nghĩ rằng tôi sẽ chia sẻ ở đây.

5
houtanb