web-dev-qa-db-ja.com

C / C ++でMac OS X固有のコードをラップするマクロ

さまざまな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固有のマクロですか?

41
mloskot

それはすべて異なります。

各マクロは、意味が異なるものを指定します。
参照: 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特定のコードを区別します。

23
Martin York

以下は、オペレーティングシステム用のマクロの ニースリスト です。

ウェブ上の__OSX__に関する情報はほとんどありません。 __Apple__を使用すると安全です。

13

私は通常__MACH__ このため。これは、OS Xの最も初期のバージョンから(そしておそらく以前にも)定義されています。

4
Paul R

使用する

#if defined(__Apple__) && defined(__MACH__)

Apple MacOS(iOSではない)を区別するため)。

[〜#〜] osx [〜#〜]はどこから来たのか」について:

(このような)コンパイラマクロのオンラインリストの一部は__MACOSX__。いくつかのフォーラムのコメント(これらのような)は__OSX__が存在します。これらは正しくありません。 OSXコンパイラによって事前定義されたそのようなマクロはありませんが、特定のプロジェクトのMakefileおよびGNU autoconfのようなプラットフォーム検出スクリプトによって定義されます。

ソース: http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

2
scravy

この質問に遭遇した人> = 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プラットフォームでコンパイルしているかどうかを確認できます。

1
SMGreenfield

参照 http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin

#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です。

1
prewett