BCCIOSARM64
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 を使用します。
目次
一般情報
フィールド | 値 |
---|---|
呼び出し規約 | |
名前マングル | Itanium(iOS での相違点) |
標準ライブラリ | 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 型 NativeInt は long
型によって実装されています。このことは、定数が関係するコードに影響を及ぼす可能性があります。あいまいさを避けるため、コードでは、次のコード断片で示されているように、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 の受信側で切り詰められる可能性があります。
関連項目
- BCCIOSARM と旧世代の C++ コンパイラの違い
- オプション:
- C++ ヘッダー ファイル:
- サポートされている Modern C++ 機能
- BCCIOSARM のエラーと警告