Mac OS X、iOS、Linux、Windowsでコンパイルする必要のあるクロスプラットフォームのC / C ++コードがある場合、プリプロセッサプロセス中にそれらを確実に検出するにはどうすればよいですか?
3 に答える
ほとんどのコンパイラで使用される定義済みのマクロがあります。リストはここにあります。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
定義されたマクロは、使用するコンパイラによって異なります。
は、Windows x64バージョンを対象とする場合でも定義されているため_WIN64
#ifdef
、ネストすることができます。これにより、一部のヘッダーインクルードが両方に共通している場合にコードの重複が防止されます(アンダースコアがない場合も、IDEはコードの適切なパーティションを強調表示できます)。_WIN32
#ifdef
_WIN32
WIN32
ジェイクが指摘するように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
iOS 14以降、マクロが非推奨になっTARGET_OS_SIMULATOR
たため、上記でマクロをチェックしていることに注意してください。TARGET_IPHONE_SIMULATOR
2021年1月5日:@Sadapのコメントのおかげでリンクが更新されました。
当然の答えの一種:このサイトの人々は、すべてのOS/コンパイラペアに対して定義されたマクロのテーブルを作成するために時間をかけました。
たとえば、これ_WIN32
はWindowsではCygwin(POSIX)で定義されていませんが、Windows、Cygwin(非POSIX)、およびMinGWで使用可能なすべてのコンパイラ(Clang、GNU、Intelなど)でコンパイルするために定義されていることがわかります。 。
とにかく、私はテーブルが非常に有益であるとわかり、ここで共有したいと思いました。