Clang 拡張 C++ コンパイラ
C++ コンパイラ への移動
RAD Studio C++ コンパイラの最新世代は、オープン ソースの Clang コンパイラ(LLVM コンパイラ バックエンドに対するフロント エンド)をベースとしています。
RAD Studio には次の Clang 拡張 C++ コンパイラが用意されています。
コンパイラ | プラットフォーム | Clang のバージョン | LLVM のバージョン |
---|---|---|---|
BCC32C | 32 ビット Windows | 3.3 | 3.3 |
BCC32X [1] | 32 ビット Windows | 3.3 | 3.3 |
BCC64 | 64 ビット Windows | 3.3 | 3.3 |
BCCIOSARM | 32 ビット iOS | 3.3 | 3.3 |
BCCIOSARM64 | 64 ビット iOS | 3.3 | 3.5 |
BCCAARM | Android | 3.3 | 3.3 |
- ↑ BCC32X は、Clang コマンドライン フラグを使用し、その他の Clang ベース コンパイラ(BCC64、BCCIOSARM、BCCIOSARM64、BCCAARM)との互換性を実現します。BCC32C は、従来のコンパイラ フラグ(BCC32)と互換性があります。
目次
Clang 拡張 C++ コンパイラと旧世代の C++ コンパイラの違い
Clang 拡張 C++ コンパイラはまったく新しいコード ベースになっており、RAD Studio の旧世代の C++ コンパイラ(下記)とは大きく異なります。
Clang 拡張 C++ コンパイラと 2 種類の旧世代の C++ コンパイラの著しい違いをいくつか以下に示します。
- Clang 拡張 C++ コンパイラは、
-E
スイッチで実行されると、プリプロセッサにもなります。- 64 ビット Windows の場合は、これとは別に、CPP64.EXE プリプロセッサもあります。
- Clang 拡張 C++ コンパイラでは、テンプレートの 2 段階ルックアップを行います。
- つまり、依存型に関連付けられていない名前が(インスタンス化の前に)第1フェーズでルックアップされ、その結果、旧世代の C++ コンパイラでは通知されなかったエラーが発生するおそれがあります。 第2フェーズ(インスタンス化)では、テンプレート コードは再びルックアップされ、依存型に対してすべての呼び出しが妥当かどうかを確認します。 さらなる情報については、「Clang の 2 フェーズ名前ルックアップ」を参照してください。
例:)テンプレートは、その特定の型については存在しない関数への呼び出しを行う場合があります。
- Clang 拡張 C++ コンパイラでは、関数宣言でのみデフォルト引数を使用できます。
- 旧世代の C++ コンパイラでは、関数ポインタまたはクロージャの宣言でもデフォルト引数を使用できます。
- Clang 拡張 C++ コンパイラでは、プリプロセッサ指令で、
#if sizeof(ATypeName) > 20
などのように sizeof を使用することはできません。 - Clang 拡張 C++ コンパイラの方が変換に関して厳密な扱いがなされます。
- たとえば、文字列定数を
char *
に変換すると、警告が発生します(文字列リテラルからchar *
への変換は非推奨になっています)。一方、char *
をunsigned char *
で初期化すると、明らかなエラーになります('char *' 型の変数をBYTE *
型、つまりunsigned char *
型の右辺値で初期化することはできません)。
- たとえば、文字列定数を
- Clang 拡張 C++ コンパイラでは、
__try
とcatch
を混在させることはできません。catch
はtry
と一緒に使用し、__try
は__except
や__finally
と一緒に使用しなければならないからです。 - Unicode 識別子は Clang 拡張 C++ コンパイラではサポートされていません。
- CPP32 では
-Hp
オプションをサポートしており、それが指定された場合は、プリコンパイル済みヘッダー ウィザードで使用されるヘッダー ガード情報を出力します。 - Unix スタイル(
#line
)は CPP32 のデフォルト(#line
など)ではありません。 - Clang 拡張 C++ コンパイラは、C++11 属性である Final、deprecated、noreturn をサポートしていません。 Clang 拡張 C++ コンパイラでの回避策については、「C++11 属性の回避策」を参照してください。
- 旧世代の C++ コンパイラの多くのオプションは Clang 拡張 C++ コンパイラではサポートされておらず、その逆もまた同様です(以下を参照)。
- Clang 拡張 C++ コンパイラは、__FUNC__ を定義済みマクロとして処理しません。代わりに、これは定義済み識別子(定義済み関数ローカル変数)とされ、関数名をスタティック文字配列としてとらえます。
詳細については、「Clang 拡張 C++ コンパイラと旧世代の C++ コンパイラの違い」を参照してください。
旧世代の C++ コンパイラ オプションの Clang 拡張 C++ コンパイラ オプションへの転換
「Clang 拡張 C++ コンパイラでサポートされているプロジェクト オプション」を参照してください。
旧世代の C++ コンパイラ プロジェクトを Clang 拡張 C++ コンパイラでコンパイルする際によく起こる問題
Clang 拡張 C++ コンパイラが ANSI に厳密に準拠することに起因する新たなエラーが発生するおそれがあります。
詳細については、以下を参照してください。
プリコンパイル済みヘッダーのサポート
Clang 拡張 C++ コンパイラでは 1 つのプリコンパイル済みヘッダーを使用でき、それはデフォルトでは <プロジェクト名><番号>PCH.h
という名前になります。
詳細については、「Clang 拡張 C++ コンパイラでプリコンパイル済みヘッダーを使用する」を参照してください。
定義済みマクロ
Clang 拡張コンパイラでサポートされている定義済みマクロは多数あります。たとえば、BCCIOSARM では __APPLE__
や __BCCPLUSPLUS__
などの条件定義をサポートしています。
サポートされている定義済みマクロをすべて表示するには、次のようにコンパイラのコマンドライン インターフェイスを使用します。
echo | <compiler> -E -dM -
-E
オプションを指定すると、プリプロセッサのみ実行されます。-dM
を指定すると、プリプロセス時に定義されたマクロをすべてダンプして停止します。最後の -
は stdin から入力を受け取ることを指定しており、それは空の echo
からパイプを通じて送られます。
詳細については、「定義済みマクロ」を参照してください。
キーワード
このセクションでは、Clang 拡張 C++ コンパイラで使用する際に特別な考慮が必要な C++ キーワードやそれらのコンパイラでサポートされていないキーワードのアルファベット順の一覧を示します。
サポートしている | サポートしていない |
---|---|
Clang 拡張 C++ コンパイラでサポートされていないキーワードの機能を代替する方法については、「C++11 属性の回避策(Clang 拡張 C++ コンパイラ)」を参照してください。
自動参照カウントがデフォルトで有効の可能性あり
LLVM ベースの Delphi コンパイラでは自動参照カウント(ARC)を使用します。特定のターゲット プラットフォーム向けの Delphi コンパイラが LLVM をベースにしている場合、対応する Clang 拡張 C++ コンパイラでは ARC が自動的に有効になっています。ARC を有効にするとは、C++ コンパイラのコマンドライン インターフェイスに -fborland-auto-refcount
スイッチを渡すことです。
どの Clang 拡張 C++ コンパイラで ARC がデフォルトで有効になっているかを次の表に示します。
プラットフォーム | Delphi コンパイラ | C++ コンパイラ | ARC がデフォルトで有効 |
---|---|---|---|
32 ビット Windows |
× | ||
64 ビット Windows |
× | ||
32 ビット iOS |
○ | ||
64 ビット iOS |
○ | ||
Android |
○ |
- メモ: コマンド ラインで ARC を無効にしないでください。これは、FireMonkey フレームワークおよび RTL フレームワークで作業するのに必須です。
並列コンパイルの使用
並列コンパイルを行うと、コンパイラがシステム プロセッサの別々のコアを使用して複数のソース ファイルを同時に処理できるため、コンパイル時間を大幅に短縮できます。
IDE で特定の C++ プロジェクトについて並列コンパイルを有効にするには、対象のプロジェクトを開き、以下の手順を実施します。
- [プロジェクト|オプション...|C++ コンパイラ]を選択し、[コンパイル全般]の下の[バッチ コンパイルを有効にする]オプションをオンにします。
- [プロジェクト|オプション...|プロジェクト プロパティ]を選択し、以下のように設定します。
- [C++ コンパイラを別プロセスで実行する]オプションをオンにします。
- 使用したい並列サブプロセスの数を選択します。
- メモ: 選択するサブプロセス数は、CPU のコア数以下でなければなりません。
関連トピック
- BCC32C
- BCC32X
- BCC64
- BCCIOSARM
- BCCIOSARM64
- BCCAARM
- Clang 拡張 C++ コンパイラと旧世代の C++ コンパイラの違い
- Clang 拡張 C++ コンパイラでサポートされているプロジェクト オプション
- Clang 拡張 C++ コンパイラでサポートされていないオプション
- Clang 拡張 C++ コンパイラのプリコンパイル済みヘッダー関連コマンド ライン オプション
- Clang 拡張 C++ コンパイラでのプリコンパイル済みヘッダーの使用
- Clang 拡張 C++ コンパイラのエラーと警告
関連項目
- RAD Studio の Clang 拡張 C++ コンパイラでサポートされている C++11 機能
- C++11 言語機能の準拠状況
- Clang 拡張 C++ コンパイラのコマンドライン インターフェイス