Clang ベースの C++ コンパイラ

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

コマンドライン ユーティリティ:インデックス への移動


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

Appmethod には次の Clang ベース コンパイラが用意されています。

Clang ベースの C++ コンパイラと旧世代の C++ コンパイラの違い

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

Clang ベースの C++ コンパイラと BCC32 の著しい違いをいくつか以下に示します。

  • Clang ベースの C++ コンパイラは、-E スイッチを指定して実行されれば、プリプロセッサにもなります。
    64 ビット Windows の場合は、これとは別に、CPP64.EXE プリプロセッサもあります。
  • Clang ベースの C++ コンパイラでは、テンプレートの 2 段階ルックアップを行います。
    つまり、依存型に関連付けられていない名前が(インスタンス化の前に)第 1 段階でルックアップされ、その結果、BCC32 では通知されなかったエラーが発生するおそれがあります。
  • Clang ベースの C++ コンパイラでは、関数宣言でのみデフォルト引数を使用できます。
    BCC32 では、関数ポインタまたはクロージャの宣言でもデフォルト引数を使用できます。
  • 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 オプションをサポートしており、それが指定された場合は、プリコンパイル済みヘッダー ウィザードで使用されるヘッダー ガード情報を出力します。
  • CPP32 のデフォルトは Unix スタイル(#line など)ではありません。
  • finaldeprecatednoreturn の各 C++0x 属性は Clang ベースの C++ コンパイラではサポートされていません。Clang ベースの C++ コンパイラでの回避策については、「C++0x 属性の回避策」を参照してください。
  • BCC32 の多くのオプションは Clang ベースの C++ コンパイラではサポートされておらず、その逆もまた同様です(以下を参照)。

詳細については、「Clang ベースの C++ コンパイラと旧世代の C++ コンパイラの違い」を参照してください。

BCC32 オプションの Clang ベース C++ コンパイラ オプションへの転換

Clang ベースの C++ コンパイラでサポートされているプロジェクト オプション」を参照してください。

BCC32 プロジェクトを Clang ベースの C++ コンパイラでコンパイルする際によく起こる問題

Clang ベースの C++ コンパイラが ANSI に厳密に準拠することに起因する新たなエラーが発生するおそれがあります。

詳細については、以下を参照してください。

Clang ベースの C++ コンパイラのオプション

メモ: コマンド ラインで Clang ベースの C++ コンパイラを使用すると、予期しない結果になることがあります。ただし、IDE で使用できる Clang ベース C++ コンパイラ オプションについては、実装時にテスト済みです。詳細については、以下を参照してください。

Clang ベースのコンパイラは互いに非常に似ており、コマンドライン オプションの大半は共通です。Appmethod には Clang の機能のサブセットが統合されており、それらの一部は[C++ コンパイラ]プロジェクト オプションの各ページで設定可能です。

コマンド ラインでの実行

コマンド ラインで Clang ベースの C++ コンパイラを呼び出す場合は、以下のように、ドライバを介して行うことをお勧めします。

<compiler> -c test.cpp

または

<compiler> -tWCV myApplication.cpp

この場合、Clang ベースの C++ コンパイラは、以下のコマンドライン パラメータがデフォルトで有効になった状態で実行されます。

Clang の使用経験が豊富で、ドライバを介さずに Clang ベースの C++ コンパイラを使用する場合は、最初のオプションとして -cc1 を渡して、処理を手動で行いすべてのオプションを自分で完全/厳密に管理することをコンパイラに明示しなければなりません。この場合、オプションが自動的に挿入されることはなく、上記のコマンドライン パラメータを手動で指定する必要があります。

エラー通知オプション

ld: --warn-common 共通シンボルの重複について警告する
ld: --warn-unresolved-symbols 未解決のシンボルを警告として通知する
ld: --error-unresolved-symbols 未解決のシンボルをエラーとして通知する

プリコンパイル済みヘッダーのサポート

Clang ベースの C++ コンパイラでは 1 つのプリコンパイル済みヘッダーを使用でき、それはデフォルトでは <プロジェクト名><番号>PCH.h という名前になります。

詳細については、「Clang ベースの C++ コンパイラでプリコンパイル済みヘッダーを使用する」を参照してください。

BCC32 と Clang ベースの C++ コンパイラの基本的な違いを 1 つ説明するために、MAKE ファイルに似たコード断片を 2 つ以下に示します。1 つは BCC32 の例で、もう 1 つは Clang ベースの 64 ビット Windows 版 C++ コンパイラである BCC64 の例です。

 # BCC32 Build
 source1.obj: source1.cpp source1.h
   BCC32 -c -H projectPCH.pch source1.cpp
  
 source2.obj: source2.cpp source2.h
   BCC32 -c -H projectPCH.pch source2.cpp
 # BCC64 Build
 projectPCH.pch: projectPCH.h
   BCC64 -emit-pch -o projectPCH.pch projectPCH.h
  
 source1.obj: projectPCH.pch source1.cpp source1.h
   BCC64 -emit-obj -include-pch projectPCH.pch source1.cpp
  
 source2.obj: projectPCH.pch source2.cpp source2.h
   BCC64 -emit-obj -include-pch projectPCH.pch source2.cpp

重要なのは、プロジェクトのプリコンパイル済みヘッダーを作成するための専用のターゲットがあるということです。

定義済みマクロ

Clang ベースのコンパイラでサポートされている定義済みマクロは多数あります。たとえば、BCCIOSARM では __APPLE____BCCPLUSPLUS__ などの条件定義をサポートしています。

サポートされている定義済みマクロをすべて表示するには、次のように入力します。

echo | <compiler> -E -dM -

-E オプションを指定すると、プリプロセッサのみ実行されます。-dM を指定すると、プリプロセス時に定義されたマクロをすべてダンプして停止します。最後の - は stdin から入力を受け取ることを指定しており、それは空の echo からパイプを通じて送られます。

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

#include パスとルックアップ

Clang ベースの C++ コンパイラでは、以下のような 3 つの異なるヘッダー/ソース パスをサポートしています。

  • -isystem は、コンパイラでインクルードされるシステム ヘッダーについてのものです。このパスで見つかったヘッダーの警告は出力されません。
  • -I はサードパーティから提供されるヘッダーについてのものです。
  • -idirafter は、-I または -isystem で指定されたパスが検索された後で検索されるパスについてのものです。パスの先頭に '=' 文字が付いている場合、この文字は -sysroot で指定された値に置き換わります。
  • -iquote はユーザー独自のソース ファイルやヘッダーについてのものです。名前のとおり、このパスは引用符付きの指令(#include "file")にのみ使用されます。指定された file が見つからない場合は、あたかも #include <file> という指令であったかのように、-I-isystem で指定されたパス内でファイルが検索されます。

詳細については、「#include」を参照してください。

キーワード

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

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

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

関連トピック

関連項目