2013-12-09 6 views
11

iphoneosプラットフォームの標準アーキテクチャーとしてのarm64の導入で、64/32アーキテクチャーに特有のコードのコンパイル時の条件を実装する必要がある場合があります。コンパイル時にプラットフォームを区別するCocoaの__LP64__と__arm64__のような定義はありますか?どのように定義されていますか?

あなたはCoreGraphics/CGBase.hを見て、どのようにいくつかの人気のあるオープンソースのプロジェクトは、それはあなたがそうのような64ビットのランタイムの有無をチェックすることができることは明らかですproviding support for arm64ある場合:

#if defined(__LP64__) && __LP64__ 
... 
#else 
... 
#endif 

それは(arm64のために特別に確認することもできますthis fix for erikdoe/ocmock

#ifdef __arm64__ 
... 
#else 
.... 
#endif 

で述べたように)ちょうど64ビットのランタイムとは対照的に、定義のこれらの種類のための包括的なリスト、またはドキュメントがありますか?どこかはどう定義されていますか?投入を受けることができます機能フラグの様々な量で

clang -dM -E -x c /dev/null 

異なるCLANGバージョン船:

答えて

16

これらのマクロは、彼らがCLANGに固有のものであり、それらはしてコマンドラインに記載されていることができ、ココアに固有のものではありません設定時にオンまたはオフになるか、またはコンパイラが実行されているプラ​​ットフォームとOSによって異なります。かなり包括的なリストは、testing headersにあります。サポートされている各システムのバリエーションもテストディレクトリに散在しています。それぞれのドキュメントは、フラグがCLANGに固有であるか、リンクする標準ライブラリのいずれかで定義されているかどうかによって異なります(__llvm__defined by CLANGですが、__WCHAR_WIDTH__はLibCで定義されています)。この理由のために決定的な文書を含む包括的なリストは実際にはありません。異なるプラットフォームでは、言語仕様に準拠していれば、少し違うことが許されます。

興味深い公開Objective-Cマクロの大半は、Foundationの下部にあるFoundation/NSObjCRuntime.hの近くにあります。

+2

コンパイラの定義済みマクロの多くは、実装の詳細であり、いつでも変更される可能性があることに注意してください。 –

+2

@GregParker:おそらく*いつでも変更されることはありませんが、確かにコンパイラのバージョン間で変更される可能性があります) –

+2

将来訪れる人には、上記のCLANG呼び出しは現在のデフォルトのコンパイラ設定。 iOSへのクロスコンパイルは別のセットです。 xcodebuildを使用してここで特定のスキームを実行する方法を知ることができます。詳細については、関連するものや関連するものを更新しようとします。 http://stackoverflow.com/questions/20116475/how-can-i-specify-additional-clang-options-for-xcode-project –

1

this listが便利です。

リンクは、アーキテクチャifdefのリストと正確に一致します。hereは、他のリストへのリンク(コンパイラおよびプラットフォーム検出用)を見つけることができます。

関連する問題