インテル® C++ コンパイラー 15.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* では、Clang と互換性がある 2 つのインテル® C++ コンパイラーを利用できます。
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
__INTEL_CLANG_COMPILER マクロにより、icl (Clang 互換コンパイラー) でコンパイルするコードを保護できます。 ただし、icc でコンパイルできるコードが icl でもコンパイルできるとは限らないため、ビルドエラーにならないように既存のマクロチェックを置換することを推奨します。 また、__EDG__ マクロにより、icc (EDG ベースのフロントエンド・コンパイラー) でコンパイルするコードを保護することもできます。
次のようにマクロチェックを置換します。
#if defined(__INTEL_COMPILER) // icc および icl と互換性のあるコード # if defined(__INTEL_CLANG_COMPILER) // icl とのみ互換性のあるコード # elif defined(__EDG__) // icc とのみ互換性のあるコード # endif #else // ほかのコンパイラー用のコード #endif
コードによっては他のコンパイラーには適していませんが、icc と icl のどちらにも適しているため、すべての __INTEL_COMPILER チェックを置換する必要はありません。 例えば、インテル固有の組込み関数やプラグマは icc/icl コンパイラーでコンパイルされているため、これらを使用するコードのマクロチェックは置換する必要がありません。