Clang 拡張 C++ コンパイラ

提供: Appmethod Topics
移動先: 案内検索

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


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

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

コンパイラ プラットフォーム Clang のバージョン LLVM のバージョン
BCC32C 32 ビット Windows 3.3 3.3
BCC64 64 ビット Windows 3.3 3.3
BCCIOSARM 32 ビット iOS 3.1 3.1
BCCIOSARM64 64 ビット iOS 3.3 3.5
BCCAARM Android 3.1 3.3

Clang 拡張 C++ コンパイラと旧世代の C++ コンパイラの違い

Clang 拡張 C++ コンパイラはまったく新しいコード ベースになっており、Appmethod の旧世代の C++ コンパイラ(下記)とは大きく異なります。

Clang 拡張 C++ コンパイラと 2 種類の旧世代の C++ コンパイラの著しい違いをいくつか以下に示します。

  • Clang 拡張 C++ コンパイラは、-E スイッチを指定して実行されれば、プリプロセッサにもなります。
    64 ビット Windows の場合は、これとは別に、CPP64.EXE プリプロセッサもあります。
  • Clang 拡張 C++ コンパイラでは、テンプレートの 2 段階ルックアップを行います。
    つまり、依存型に関連付けられていない名前が(インスタンス化の前に)第 1 段階でルックアップされ、その結果、旧世代の C++ コンパイラでは通知されなかったエラーが発生するおそれがあります。第 2 段階(インスタンス化)では、すべての呼び出しが依存型に対して有効であることを確認するために、テンプレート コードが再度ルックアップされます。詳細は、「Two-phase name lookup for Clang(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++ コンパイラでは、Finaldeprecatednoreturn の各 C++11 属性をサポートしていません。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__ などの条件定義をサポートしています。

詳細については、「定義済みマクロ」を参照してください。

キーワード

このセクションでは、Clang 拡張 C++ コンパイラで使用する際に特別な考慮が必要な C++ キーワードやそれらのコンパイラでサポートされていないキーワードのアルファベット順の一覧を示します。

サポートしている サポートしていない

Clang 拡張 C++ コンパイラでサポートされていないキーワードの機能を代替する方法については、「C++0x 属性の回避策」を参照してください。

自動参照カウントがデフォルトで有効の可能性あり

LLVM ベースの Object Pascal コンパイラでは自動参照カウント(ARC)を使用します。特定のターゲット プラットフォーム向けの Object Pascal コンパイラが LLVM をベースにしている場合、対応する Clang 拡張 C++ コンパイラでは ARC が自動的に有効になっています。

どの Clang 拡張 C++ コンパイラで ARC がデフォルトで有効になっているかを次の表に示します。

プラットフォーム Object Pascal コンパイラ 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 のコア数以下でなければなりません。

関連トピック

関連項目