BCCIOSARM64

提供: RAD Studio
移動先: 案内検索

Clang 拡張 C++ コンパイラ への移動


BCCIOSARM64 は 64 ビット iOS 向けの RAD Studio C++ コンパイラです。

BCCIOSARM64 は Clang 3.3.1 をベースにしています。BCCIOSARM64 コンパイラと他の Clang 拡張 C++ コンパイラに共通する事項については、「Clang 拡張 C++ コンパイラClang ベースの C++ コンパイラ」を参照してください。

メモ:
  • BCCIOSARM64 では iOS シミュレータをサポートしていません。iOS シミュレータは特別な非 ARM バージョンの iOS を実行します。RAD Studio には、iOS シミュレータ用の C++ コンパイラが用意されていません。
  • 32 ビット iOS の場合は、代わりに BCCIOSARM を使用します。

一般情報

フィールド
呼び出し規約

Apple 社の AAPCS(ARM アーキテクチャ向けの手続き呼び出し標準)ドキュメント

名前マングル ItaniumiOS での相違点
標準ライブラリ LLVM libc++

出力ファイル

ファイルの種類 ファイル拡張子 ファイル形式
実行可能ファイル Mach-O
共有ライブラリ 該当なし¹
静的ライブラリ .a ar
コンパイル済みオブジェクト .o Mach-O
メモ: iOS では、共有ライブラリを含んだアプリケーションをサポートしていません。

BCCIOSARM64 向けの C++ コードの記述

BCCIOSARM64 専用の C++ コードを記述するには、次のパターンを使用します。

#if defined(__APPLE__) && defined(__arm64__)
    // Your code.
#endif
メモ: これはコンパイラ固有のコードであり、iOS 固有のコードを書く方法としてはお勧めしません。「iOS アプリケーションの作成」の「iOS 専用コードの作成」セクションを参照してください。

詳細については、|「Clang 拡張 C++ コンパイラ」トピックの「定義済みマクロ」を参照してください。

一部のデータ型の実装と BCCIOSARM64

iOS 上の 64 ビット ランタイム環境では、多くの組み込みデータ型のサイズが変更されています。このセクションでは、64 ビット iOS デバイス向けの C++ コードで次の Delphi データを使用する方法について説明します。

NativeInt

iOS64(64 ビット iOS)プラットフォームでは、Delphi 型 NativeIntlong 型によって実装されています。このことは、定数が関係するコードに影響を及ぼす可能性があります。あいまいさを避けるため、コードでは、次のコード断片で示されているように、L サフィックスを使用する必要があります。


NativeInt ni;
#if defined(_PLAT_IOS64)
  if (ni == 99L)
#else
  if (ni == 99)
#endif


メモ: 上記のコード断片で、L サフィックスを使用しない場合、iOS64 プラットフォームではコードにあいまいさが生じます。

TypeInfo

Delphi コードでは、TypeInfo 関数は、指定された型を記述する RTTI(実行時型情報)ブロックへのポインタを返します。ただし、この関数は C++Builder では使用できません。C++ コードでは、代わりに __delphirtti キーワードを使用しなければなりません。

iOS64 プラットフォームでは、long 型の場合、TypeInfo 関数は System::tkInt64 という種類の型情報を返します。一方、他のプラットフォームでは、System::tkInteger という種類の型情報を返します。この点を明確にするために、次のようなコード断片を考えてみましょう。

System::Typinfo::PTypeInfo ti;
    ti = __delphirtti(long);
#if defined(_PLAT_IOS64)
    assert(ti->Kind == System::tkInt64);
    assert(pData->MinInt64Value == -9223372036854775808L);
    assert(pData->MaxInt64Value == 9223372036854775807L);
#else
    assert(ti->Kind == System::tkInteger);
    assert(pData->OrdType == System::Typinfo::otSLong);
    assert(pData->MinValue == -2147483648);
    assert(pData->MaxValue == 2147483647);
#endif

上記の TypeInfo の違いにより、サーバーとやり取りする iOS64 クライアント コードとサーバーの間に非互換性が生じるおそれがあります。たとえば、SOAP で long 型の値を送信すると、iOS64 プラットフォームではそれを xml:long としてシリアル化するのに対して、他のプラットフォームでは xml:int としてシリアル化します。

たとえば、long 値が Win32 クライアントと iOS64 クライアントから送信された場合に生成される XML コードを次の表に示します。

iOS64   Win32  
<V xsi:type="xsd:long">-1000</V> <V xsi:type="xsd:int">-1000</V>

大半のランタイム環境では、この XML コードを逆シリアル化の際に元の適切な型に透過的に変換します。ただし、xml:long と xml:int の範囲の違いに起因して、iOS64 クライアントから送信された値が Win32 の受信側で切り詰められる可能性があります。

関連項目