インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド
インテル® コンパイラーは、Clang コンパイラーと互換性があります。互換バージョンの詳細は、リリースノートに記載されています。Clang は LLVM プロジェクトの一部で、C、C++、Objective-C、および Objective-C++ をサポートする新しいコンパイラー・フロントエンドを提供します。Clang と LLVM プロジェクトに関する詳細は、「clang: a C language family frontend for LLVM」 (http://clang.llvm.org (英語)) を参照してください。
OS X* プラットフォームでインテル® C++ コンパイラーを使用して作成された C 言語オブジェクト・ファイルは、Clang および C/C++ 言語ライブラリーとバイナリー互換があります。インテル® コンパイラーまたは Clang コンパイラーを使用して、オブジェクト・ファイルをリンカーに渡すことができます。
OS X* では、次のコンパイラーを利用できます。
ICL - Clang ベースのフロントエンドを提供し、icl/icl++ コマンドで起動します。このコンパイラーでは、Clang オプションを利用できます。
ICC - EDG ベースのフロントエンドを提供し、icc/icpc コマンドで起動します。このコンパイラーでは、Clang オプションを利用できません。
どちらのコンパイラーも C/C++、Objective-C コードをコンパイルできます。icl/icl++ または icc/icpc コマンドでコンパイラーを起動すると、デフォルトで libc++ ライブラリーとヘッダーを使用してコードをコンパイルします。-stdlib=libstdc++ コンパイラー・オプションを指定して、GNU* 実装の標準 C++ ライブラリーを使用するように切り替えることができます。
OS X* 10.8 以前では、インテル® C++ コンパイラーはデフォルトで C++ 標準ライブラリー (libstdc++) の GNU* 実装を使用します。OS X* 10.9 以降では、デフォルトで libc++ を使用します。
以下のマイナーな機能を除き、Clang ベースのコンパイラーでは、OpenMP* やインテル® Cilk™ Plus などの GCC 互換コンパイラーの主な機能をすべて利用できます。
10 進の浮動小数点型 (_Decimal32、_Decimal64、_Decimal128)
識別子としての restrict キーワードの使用
入れ子された関数 (GCC 言語拡張)
エクスポートしたテンプレート
サポートされるオプション、プラグマ、組込み関数の一覧を表示するには、-help コマンドを使用します。
事前定義済みマクロにより、特定のコンパイラーでコンパイルすべきコードを保護できます。OS X* 上で、インテル® C++ コンパイラーは 2 つのマクロ (__INTEL_COMPILER マクロと __INTEL_CLANG_COMPILER マクロ) を定義し、コードの一部のコンパイルに使用するコンパイラーを指定します。マクロにより、特定のコンパイラーでコンパイルするコードを保護できます。
__INTEL_COMPILER マクロは次のように使用します。
#ifdef __INTEL_COMPILER // icc、icl でコンパイル可能なコード #else // ほかのコンパイラーでコンパイル可能なコード #endifまた、__EDG__ マクロにより、icc (EDG ベースのフロントエンド・コンパイラー) でコンパイルするコードを保護することもできます。
__INTEL_CLANG_COMPILER マクロにより、icl (Clang コンパイラー) でコンパイルするコードを保護できます。ただし、icc [EDG コンパイラー] でコンパイルできるコードが icl [Clang コンパイラー] でもコンパイルできるとは限らないため、ビルドエラーにならないように既存のマクロチェックを置換することを推奨します。
次のようにマクロチェックを置換します。
#if defined(__INTEL_COMPILER) // icc、icl でコンパイル可能なコード # if defined(__INTEL_CLANG_COMPILER) // icl でのみコンパイル可能なコード # if defined(__EDG__) // icc でのみコンパイル可能なコード # endif #else // ほかのコンパイラーでコンパイル可能なコード #endif
すべての __INTEL_COMPILER チェックを置換する必要はありません。例えば、インテル固有の組込み関数やプラグマは icc (EDG コンパイラー)/icl (CLANG コンパイラー) コンパイラーでコンパイルされているため、これらを使用するコードのマクロチェックは置換する必要がありません。