さまざまなCおよびC++ソースの読み取り中に、2つのマクロ__Apple__
および__OSX__
に遭遇しました。さまざまなコード、特に__OSX__
システムに由来するコードで*BSD
がたくさん使用されていることがわかりました。
ただし、__OSX__
のみをテストするだけでは不十分で、__Apple__
マクロを使用してテストを完了する必要がある場合があります。
Mac OS XへのコマンドラインUnixツールの移植 ガイドは__Apple__
を指定し、さらに__Apple_CC__
を指定していますが、を指定していません__OSX__
について言及します。
GCCからの移植 ガイドによると:
#ifdef __GNUC__
を使用して、GCC固有のコードをラップします。- Mac OS X固有のコードをラップするには、
#ifdef __Apple_CC__
を使用します。
繰り返しますが、__OSX__
マクロについての言及はありません。
C/C++プログラムでOSX固有のコードを区別するために使用する必要があるMac OS XプラットフォームおよびXCode開発環境で事前定義されているマクロは何ですか?
__OSX__
マクロはどこに定義されていますか? *BSD
固有のマクロですか?
それはすべて異なります。
各マクロは、意味が異なるものを指定します。
参照: https://developer.Apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//Apple_ref/doc/uid/TP40002850-SW1
__Apple__
このマクロは、Appleコンピュータで定義されています。
__Apple_CC__
このマクロは、コンパイラのバージョン番号を表す整数に設定されます。これにより、たとえば、同じバージョンのGCCに基づくが、バグの修正や機能が異なるコンパイラを区別できます。値が大きいほど、後のコンパイラを示します。
__OSX__
おそらくOSはOS Xの特定のバリアントです
したがって、上記の定義を前提として、__Apple__
Apple特定のコードを区別します。
以下は、オペレーティングシステム用のマクロの ニースリスト です。
ウェブ上の__OSX__
に関する情報はほとんどありません。 __Apple__
を使用すると安全です。
私は通常__MACH__
このため。これは、OS Xの最も初期のバージョンから(そしておそらく以前にも)定義されています。
使用する
#if defined(__Apple__) && defined(__MACH__)
Apple MacOS(iOSではない)を区別するため)。
「[〜#〜] osx [〜#〜]はどこから来たのか」について:
(このような)コンパイラマクロのオンラインリストの一部は
__MACOSX__
。いくつかのフォーラムのコメント(これらのような)は__OSX__
が存在します。これらは正しくありません。 OSXコンパイラによって事前定義されたそのようなマクロはありませんが、特定のプロジェクトのMakefileおよびGNU autoconfのようなプラットフォーム検出スクリプトによって定義されます。
この質問に遭遇した人> = 2019には、「Availability.h」というヘッダーがあることがわかりました。
そのヘッダーには、次のような#definesがあります。
#define __MAC_10_0 1000
#define __MAC_10_1 1010
#define __MAC_10_2 1020
#define __MAC_10_3 1030
#define __MAC_10_4 1040
#define __MAC_10_5 1050
#define __MAC_10_6 1060
#define __MAC_10_7 1070
#define __MAC_10_8 1080
#define __MAC_10_9 1090
#define __MAC_10_10 101000
#define __MAC_10_10_2 101002
#define __MAC_10_10_3 101003
#define __MAC_10_11 101100
#define __MAC_10_11_2 101102
したがって、特定のMacOSプラットフォームでコンパイルしているかどうかを確認できます。
#ifdef __Apple__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
...
#endif /* TARGET_OS_MAC */
#endif /* __Apple__ */
ご了承ください __OSX__
は[〜#〜]存在しません[〜#〜]存在します、少なくともXcode 9。
また、#if TARGET_OS_MAC
ない#ifdef
。常に定義されていますが、macOSでない場合は0です。