Clang 拡張 C++ コンパイラ

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

C++ コンパイラ への移動


RAD Studio C++ コンパイラの最新世代は、オープン ソースの Clang コンパイラLLVM コンパイラ バックエンドに対するフロント エンド)をベースとしています。

RAD Studio には次の Clang 拡張 C++ コンパイラが用意されています。

コンパイラ プラットフォーム Clang のバージョン LLVM のバージョン
BCC32C 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

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++ コンパイラでは、__trycatch を混在させることはできません。catchtry と一緒に使用し、__try__except__finally と一緒に使用しなければならないからです。
  • Unicode 識別子は Clang 拡張 C++ コンパイラではサポートされていません。
  • CPP32 では -Hp オプションをサポートしており、それが指定された場合は、プリコンパイル済みヘッダー ウィザードで使用されるヘッダー ガード情報を出力します。
  • Unix スタイル(#line)は CPP32 のデフォルト(#line など)ではありません。
  • Clang 拡張 C++ コンパイラは、C++11 属性である Finaldeprecatednoreturn をサポートしていません。 Clang 拡張 C++ コンパイラでの回避策については、「C++11 属性の回避策」を参照してください。
  • 旧世代の C++ コンパイラの多くのオプションは Clang 拡張 C++ コンパイラではサポートされておらず、その逆もまた同様です(以下を参照)。

詳細については、「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

DCC32

BCC32C

×

64 ビット Windows

DCC64

BCC64

×

32 ビット iOS

DCCIOSARM

BCCIOSARM

64 ビット iOS

DCCIOSARM64

BCCIOSARM64

Android

DCCAARM

BCCAARM

メモ: コマンド ラインで ARC を無効にしないでください。これは、FireMonkey フレームワークおよび RTL フレームワークで作業するのに必須です。

並列コンパイルの使用

並列コンパイルを行うと、コンパイラがシステム プロセッサの別々のコアを使用して複数のソース ファイルを同時に処理できるため、コンパイル時間を大幅に短縮できます。

IDE で特定の C++ プロジェクトについて並列コンパイルを有効にするには、対象のプロジェクトを開き、以下の手順を実施します。

  1. [プロジェクト|オプション...|C++ コンパイラを選択し、[コンパイル全般]の下の[バッチ コンパイルを有効にする]オプションをオンにします。
  2. [プロジェクト|オプション...|プロジェクト プロパティを選択し、以下のように設定します。
    1. [C++ コンパイラを別プロセスで実行する]オプションをオンにします。
    2. 使用したい並列サブプロセスの数を選択します。
      メモ: 選択するサブプロセス数は、CPU のコア数以下でなければなりません。

関連トピック

関連項目