1. ホーム
  2. c++

[解決済み】CプリプロセッサでMac OS X、iOS、Linux、Windowsを確実に検出する方法とは?重複

2022-03-26 17:29:03

質問

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がコードの正しい部分を強調できるようにします)。