スマート デバイス プロジェクト用のコンパイラ

更新 : 2007 年 11 月

Visual Studio には、スマート デバイスで使用されるマイクロプロセッサをターゲットとする次のコンパイラが含まれています。

  • 32 ビット ARM C、および C++ プログラムのコンパイルとリンクに使用される 32 ビット C/C++ コンパイラ

  • 32 ビット Renesas SH-4 C、および C++ プログラムのコンパイルとリンクに使用される 32 ビット C/C++ コンパイラ

  • MIPS16、MIPS32、MIPS64 C、および C++ プログラムのコンパイルとリンクに使用される C/C++ コンパイラ

コンパイラは、COFF (Common Object File Format) のオブジェクト ファイルを生成します。コンパイラ プログラムは、各ソース ファイルと、指定されていない限り各コンパイルのオブジェクト ファイルをコンパイルします。コンパイラには、コマンド ライン (CL)、CL 環境変数、および指定されたすべての応答ファイルに一覧表示されたオプションが含まれています。

デスクトップとデバイスの間での Visual Studio コンパイラの相違点

相違点

説明

[詳細] タブの [アーキテクチャ用コンパイル] ドロップダウン リスト

デバイス プロジェクトの [プロジェクトのプロパティ] の [詳細] タブの [アーキテクチャ用コンパイル] ボックスの [C/C++] ノードには、一覧に [ARM4 (/QRarch4)]、[ARM5 (/QRarch5)]、[ARM4T (/QRarch4t)]、[ARM5T (/QRarch5t)] というオプションがあります。

[詳細] タブの [ARM と ARM Thumb 呼び出しの相互作用] ドロップダウン リスト

デバイス プロジェクトの [プロジェクトのプロパティ] の [詳細] タブの [ARM と ARM Thumb 呼び出しの相互作用] ボックスの [C/C++] ノードには、一覧に [はい] (/QRInterwork-return)、[いいえ] というオプションがあります。[はい] に設定すると、コンパイラは、ARM 16 および 32 ビット コードを相互にサンクするコードを生成します。

[詳細] タブの [浮動小数点のエミュレーションを有効にする] ドロップダウン リスト

デバイス プロジェクトの [プロジェクトのプロパティ] の [詳細] タブの [浮動小数点のエミュレーションを有効にする] ドロップダウン リストの [C/C++] ノードには、一覧に [はい] と [いいえ] というオプションがあります。[はい] に設定すると、コンパイラで浮動小数点演算のエミュレーションが有効になります。

[プリプロセッサ] タブの [プリプロセッサの定義] 入力ボックス

デバイス プロジェクトの [プロジェクトのプロパティ] の [プリプロセッサ] タブの [プリプロセッサの定義] 入力ボックスの [C/C++] ノードには、[親またはプロジェクトの既定値から継承] チェック ボックスと、マクロを追加するための [マクロ] ボタンがあります。

[最適化] タブの [浮動小数点の整合性] ドロップダウン リスト

デバイス プロジェクトの [プロジェクトのプロパティ] の [最適化] タブの [浮動小数点の整合性] ドロップダウン リストの [C/C++] ノードには、[既定の整合性] または [整合性の向上 (/Op)] を選択するためのドロップダウン リストがあります。

詳細については、「アルファベット順のコンパイラ オプション」を参照してください。

以前のバージョンの Visual Studio からの変更

Visual Studio 2003 と Visual Studio 2005 の間のコンパイラの変更

デバイス コンパイラは、デスクトップ コンピュータの Visual C++ コンパイラをベースとしているため、デスクトップ コンパイラのバージョン間の違いを調べると、eMbedded Visual C++ デバイス コンパイラと Visual Studio 2005 デバイス コンパイラの間の変更をよく理解できます。Visual Studio 6.0 と Visual Studio 2003 の相違点については、「Compatibility and Compliance Issues in Visual C++」を参照してください。

Visual Studio 2003 と Visual Studio 2005 の間のコンパイラの変更について、概要を次の表に示します。

問題

説明

メンバへのポインタでは、関数呼び出しに修飾名、アドレス演算子 (&)、およびかっこが必要になりました。

メソッド名のみを使用した以前のバージョンのコンパイラ用に記述されたコードでは、コンパイラ エラー C3867 またはコンパイラの警告 C4867 が生成されるようになりました。この診断は、ISO C++ 標準により必要とされます。メンバ関数へのポインタを作成するには、アドレス演算子 (&) とメソッドの完全修飾名を使用する必要があります。エラーは、& 演算子とメソッドの完全修飾名を要求しないか、関数呼び出しでかっこが見つからないことが原因で発生する可能性があります。引数リストなしで関数の名前を使用すると、複数の種類に変換可能な関数ポインタが発生します。そのため、実行時にコードにより予期しない動作が行われる可能性があります。

クラスは、friend 宣言にアクセスできる必要があります。

以前の Visual C++ コンパイラは、宣言を含むクラスのスコープ内でアクセスできないクラスへの friend 宣言を有効にしていました。Visual C++ 2005 では、このような状況の場合はコンパイラによりコンパイラ エラー C2248 が生成されます。このエラーを解決するには、friend 宣言で指定されたクラスのアクセシビリティを変更します。この変更は、ISO C++ 標準に準拠するために加えられました。

コピー コンストラクタおよびコピー代入演算子に明示的な特化を使用できません。

コピー コンストラクタまたはコピー代入演算子の明示的なテンプレート特化に依存するコードでは、コンパイラ エラー C2299 が生成されるようになりました。ISO の C++ 標準では、この使用は許可されません。この変更は、標準に準拠して、コードの移植性を向上するために加えられました。

特化されていないクラス テンプレートは、基本クラス リストのテンプレート引数として使用できません。

クラス定義用の基本クラス リスト内にある特化されていないテンプレート クラス名を使用すると、コンパイラ エラー C3203 が生成されます。特化されていないテンプレート クラス名を、基本クラス リストでテンプレート パラメータとして使用することはできません。基本クラス リストでテンプレート パラメータとしてテンプレート クラスを使用する際は、テンプレート型パラメータをテンプレート クラスに明示的に追加する必要があります。この変更は、標準に準拠して、コードの移植性を向上するために加えられました。

入れ子にされた型の宣言を使用することはできなくなりました。

入れ子にされた型の宣言を使用するコードでは、コンパイラ エラー C2885 が生成されるようになりました。このエラーを解決するには、入れ子にされた型への参照を完全に修飾するか、名前空間に型を配置するか、または typedef を作成する必要があります。この変更は、標準に準拠して、コードの移植性を向上するために加えられました。

/YX コンパイラ オプションが削除されました。

/YX コンパイラ オプションにより、自動プリコンパイル済みヘッダーをサポートしていました。このオプションは、開発環境で既定で使用されていました。ビルド構成から /YX コンパイラ オプションを削除した場合、ビルドが高速化する場合があります。パフォーマンスの問題に加えて、/YX コンパイラ オプションにより実行時に予期しない動作が発生する可能性があります。/Yc (プリコンパイル済みヘッダー ファイルを作成する)、および /Yu (プリコンパイル済みヘッダー ファイルを使用する) を使用することをお勧めします。プリコンパイル済みヘッダーの使用方法を、より細かく制御できます。

/Oa および /Ow コンパイラ オプションが削除されました。

/Oa および /Ow コンパイラ オプションは削除されたため、無視されます。コンパイラがエイリアスを使用する方法を指定するには、noalias 修飾子または restrictdeclspec 修飾子を使用してください。

/Op コンパイラ オプションが削除されました。

/Op コンパイラ オプションは削除されました。代わりに /fp:precise を使用できます。

/ML および /MLd コンパイラ オプションが削除されました。

Visual C++ 2005 では、シングルスレッドの、静的にリンクされた CRT ライブラリがサポートされなくなりました。代わりに /MT および /MTd を使用できます。

/G3/G4/G5/G6/G7、および /GB コンパイラ オプションが削除されました。

コンパイラでは、すべてのアーキテクチャに最適な出力ファイルの作成を試みる、融合されたモデルが使用されるようになりました。

/Gf コンパイラ オプションは削除されました。

代わりに /GF を使用できます。/GF は、プールされた文字列を読み取り専用セクションに配置します。これは、/Gf がそれらの文字列を追加する書き込み可能セクションより安全です。

/GS コンパイラ オプションは、既定で有効になりました。

バッファ オーバーフローのチェックが、既定で有効になりました。/GS- を使用すると、バッファ オーバーフローのチェックを無効にできます。

/Zc:wchar_t 変数は既定で有効になりました。

これは、ISO C++ 標準の動作です。wchar_t 変数は、短い符号なし整数の代わりに組み込み型が既定になります。この変更により、クライアント コードが、/Zc:wchar_t を使用せずにコンパイルされたライブラリとリンクしている場合は、バイナリ互換性がなくなります。/Zc:wchar_t- を使用すると、標準の動作ではない以前の動作に戻すことができます。この変更は、準拠したコードを既定で作成するために加えられました。

/Zc:forScope 変数は既定で有効になりました。

これは、ISO C++ 標準の動作です。for ループのスコープが終了した後にある、for ループで宣言されている変数を使用することに依存するコードは、コンパイルされません。/Zc:forScope を使用すると、標準の動作ではない以前の動作に戻すことができます。この変更は、準拠したコードを既定で作成するために加えられました。

Visual C++ 属性のパラメータ チェックを強制的に実行します。

型が文字列ではない場合は引用符で囲まれており、型が文字列の場合には引用符がない属性コンストラクタに、名前付き属性を渡すコードでは、コンパイラ エラー C2065 またはコンパイラの警告 (レベル 1) C4581 が生成されるようになりました。以前は、すべてのコンパイラ属性が文字列として解析され、必要な場合は不足している引用符をコンパイラが挿入していました。属性サポートは、パラメータ チェック検査を追加することにより強化されました。この変更により、属性コンストラクタに渡される間違った引数が原因で発生する、予期しない動作が回避されます。

コンパイラが、宣言内の既定の型として int 型を挿入しなくなりました。

宣言内に型がないコードの既定は、int 型ではなくなりました。コンパイラでは、コンパイラの警告 C4430 またはコンパイラの警告 (レベル 4) C4431 が生成されます。ISO C++ 標準では、既定の int がサポートされません。この変更は、明示的に指定した型を確実に取得するのに役立ちます。

詳細については、「Visual C++ 2005 コンパイラの互換性に影響する変更点」を参照してください。

参照

その他の技術情報

Visual C++ デバイス プロジェクトの開発