Visual C++ での互換性に影響する変更点
このドキュメントでは、互換性に影響する Visual C++ 2010 の変更点を示します。
Visual C++ コンパイラ
auto キーワードに既定の意味が新しく追加されました。 以前の意味はあまり使用されないため、この変更の影響を受けるアプリケーションはほとんどありません。
新しく static_assert キーワードが導入されたため、コード内にこの名前の識別子が既にある場合、名前の競合が発生します。
ラムダ表記が新しくサポートされたことにより、引用符で囲まれていない GUID の IDL uuid 属性でのコーディングがサポートされなくなりました。
.NET Framework 4 で破損状態の例外の概念が導入されました。この例外は、プロセスを回復できない破損状態のままにするものです。 既定では、破損状態の例外は、その他すべての例外をキャッチする /EHa コンパイラ オプションを使用してもキャッチできません。
破損した状態の例外を明示的にキャッチするには、__try-__except ステートメントを使用します。 または、関数で破損した状態の例外のキャッチを有効にする [HandledProcessCorruptedStateExceptions] 属性を適用します。
この変更は、破損した状態の例外をキャッチする必要があるシステム プログラマに影響があります。 これに該当する 8 種類の例外は、STATUS_ACCESS_VIOLATION、STATUS_STACK_OVERFLOW、EXCEPTION_ILLEGAL_INSTRUCTION、EXCEPTION_IN_PAGE_ERROR、EXCEPTION_INVALID_DISPOSITION、EXCEPTION_NONCONTINUABLE_EXCEPTION、EXCEPTION_PRIV_INSTRUCTION、STATUS_UNWIND_CONSOLIDATE です。 これらの例外の詳細については、GetExceptionCode マクロを参照してください。
/GS コンパイラ オプションが変更され、旧バージョンよりバッファー オーバーランが包括的に回避されるようになりました。 このバージョンでは、追加のセキュリティ チェックがスタックに挿入される場合があり、そのためにパフォーマンスが低下する可能性があります。 コンパイラに対し、特定の関数にセキュリティ チェックを挿入しないことを指定するには、新しい __declspec(safebuffers) キーワードを使用します。
/GL (プログラム全体の最適化) と /clr (共通言語ランタイムのコンパイル) の両方のコンパイラ オプションを使用してコンパイルする場合、/GL オプションは無視されます。 この変更は、このコンパイラ オプションの組み合わせに役立つように行われました。 この変更の結果、ビルドのパフォーマンスが向上します。
既定では、トライグラフのサポートは Visual C++ 2010 では無効になります。 トライグラフのサポートを有効にするには、/Zc:trigraphs コンパイラ オプションを使用します。 トライグラフは、2 つの連続する疑問符 ("??") と、その後に続く一意の 3 番目の文字で構成されます。 コンパイラは、トライグラフを対応する区切り文字に置き換えます。 たとえば、コンパイラは "??=" というトライグラフを '#' 文字で置き換えます。 トライグラフは、C ソース ファイルで、一部の区切り文字に対する適切なグラフィック表示がない文字セットを使用する場合に使われます。
リンカーで Windows 98 の最適化がサポートされなくなりました。 /OPT:WIN98 または /OPT:NOWIN98 を指定した場合、/OPT (最適化) オプションでコンパイル時のエラーが発生します。
RuntimeLibrary および DebugInformationFormat ビルド システム プロパティで指定される既定のコンパイラ オプションが変更されました。 既定では、これらのビルド プロパティは、Visual C++ リリース 7.0 から 10.0 で作成されるプロジェクトで指定されます。Visual C++ 6.0 で作成されたプロジェクトを移行する場合は、これらのプロパティの値を指定するかどうかを検討してください。
Visual C++ 2010 では、RuntimeLibrary = MultiThreaded (/MD) および DebugInformationFormat = ProgramDatabase (/Zi) です。 Visual C++ 9.0 では、RuntimeLibrary = MultiThreaded (/MT) および DebugInformationFormat = Disabled です。
共通言語ランタイム (CLR)
- Microsoft C# コンパイラおよび Visual Basic コンパイラでプライマリ相互運用機能アセンブリなし (No-PIA) を生成できるようになりました。 No-PIA アセンブリでは、関連するプライマリ相互運用機能アセンブリ (PIA) を配置せずに、COM 型を使用できます。 Visual C# または Visual Basic で生成された No-PIA アセンブリを使用する場合、ライブラリを使用する任意の No-PIA アセンブリを参照する前に、コンパイル コマンド上で PIA アセンブリを参照する必要があります。
Visual C++ プロジェクトおよび MSBuild
Visual C++ プロジェクトは MSBuild ツールをベースにするようになりました。 このため、プロジェクト ファイルでは、新しい XML ファイル形式とファイル サフィックス .vcxproj が使用されます。 Visual C++ 2010 では、以前のバージョンの Visual Studio で作成されたプロジェクト ファイルは、自動的に新しいファイル形式に変換されます。
既存のプロジェクトは、以前のビルド ツール (VCBUILD.exe、またはプロジェクト ファイル サフィックス .vcproj) に依存している場合に影響を受けます。
以前のリリースでは、Visual C++ で、プロパティ シートの遅延評価がサポートされました。 たとえば、親プロパティ シートで子プロパティ シートをインポートできたほか、親が子で定義された変数を使用して他の変数を定義できました。 遅延評価によって、子プロパティ シートがインポートされる前でも、親は子の変数を使用できました。 Visual C++ 2010 では、MSBuild が先行評価しかサポートしないため、定義前にプロジェクト シート変数を使用することはできません。
統合開発環境
アプリケーションはアプリケーションの終了ダイアログ ボックスで終了しなくなりました。
以前のリリースでは、abort() または terminate() 関数がアプリケーションの製品版を終了した場合、C ランタイム ライブラリでアプリケーションの終了メッセージがコンソール ウィンドウまたはダイアログ ボックスに表示されました。 この一部として、"このアプリケーションは、通常と異なる方法でランタイムにアプリケーションを中止するように要求しました。 詳細については、アプリケーションのサポートチームに問い合わせてください。" という診断メッセージが表示されます。
アプリケーションの終了メッセージの後には現在の終了ハンドラーが表示され、これが通常 Windows エラー報告 ( ワトソン博士) ダイアログ ボックスまたは Visual Studio デバッガーのため、アプリケーションの終了メッセージは余分でした。 Visual Studio 2010 以降、C ランタイム ライブラリでこのメッセージは表示されません。 さらに、ランタイムでは、デバッガーが開始するまでアプリケーションは終了しなくなります。
この変更点が互換性に影響するのは、アプリケーションの終了メッセージの以前の動作に依存していた場合のみです。
Visual Studio 2010 では、IntelliSense は C++/CLI コードまたは属性に対して機能しません。また、すべての参照の検索機能はローカル変数に対して使用できません。コード モデルでの、インポートされたアセンブリからの型名の取得も、完全修飾名への型の解決も、行われなくなっています。
Visual C++ のライブラリ
SafeInt クラスが Visual C++ に組み込まれ、個別のダウンロードは用意されません。 この変更点は、"SafeInt" という名前のクラスが配置されている場合にのみ互換性に影響します。
ライブラリ配置モデルでは、特定のバージョンのダイナミック リンク ライブラリを検索する際に、マニフェストが使用されなくなりました。 代わりに、各ダイナミック リンク ライブラリの名前にバージョン番号が含まれます。この名前を使用してライブラリを検索します。 詳細については、「Visual C++ 2010 での配置」を参照してください。
以前のバージョンの Visual Studio では、ランタイム ライブラリをビルドし直すことができました。 Visual C++ 2010 では、C ランタイム ライブラリ ファイルの独自のコピーのビルドはサポートされなくなりました。
標準テンプレート ライブラリ
<iterator> ヘッダーは、その他の多数のヘッダー ファイルに自動的には組み込まれないようになりました。 このヘッダーは、<interator> ヘッダーで定義されているスタンドアロンの反復子をサポートする必要がある場合に、明示的にインクルードするようにします。
<algorithm> ヘッダーでは、checked_* 関数および unchecked_* 関数が削除されました。 また、<iterator> ヘッダーでは、checked_iterator クラスが削除され、unchecked_array_iterator クラスが追加されました。
CComPtr::CComPtr(int) コンストラクターは削除されました。 このコンストラクターでは CComPtr オブジェクトを NULL マクロから構築できましたが、このコンストラクターは不要であり、ゼロ以外の整数からの解読不能な構築も許可していました。
CComPtr は、従来どおり 0 として定義される NULL から構築できますが、リテラルな 0 以外の整数から構築する場合は失敗します。 次の擬似コードで示す状況で、この問題に遭遇することがよくあります。
pair<X, CComPtr<T>> myVar; myVar = make_pair(x, NULL);
2 番目のステートメントを修正するには、NULL マクロの代わりに nullptr キーワードを使用します。
myVar = make_pair(x, nullptr)
ctype メンバー関数の ctype::_Do_narrow_s、ctype::_Do_widen_s、ctype::_narrow_s、および ctype::_widen_s が削除されました。 アプリケーションでこれらのメンバー関数のいずれかを使用する場合は、セキュリティで保護されていないバージョンの対応する ctype::do_narrow、ctype::do_widen、ctype::narrow、および ctype::widen に置き換える必要があります。
CRT、MFC、および ATL ライブラリ
ユーザー向けの CRT ライブラリ、MFC ライブラリ、および ATL ライブラリのビルド サポートがなくなりました。 たとえば、該当する nmake ファイルは用意されません。 ただし、ユーザーはこれらのライブラリのソース コードにはアクセスできます。 Microsoft でこれらのライブラリをビルドするために使用している MSBuild オプションについて説明したドキュメントは、今後もおそらく Visual C++ チーム ブログに投稿されます。
IA64 に対する MFC のサポートはなくなりました。 ただし、IA64 上での CRT および ATL はまだ提供されます。
序数値は MFC モジュール定義 (.def) ファイル内で再利用されなくなりました。 この変更により、序数値がマイナー バージョン間で異なることはなくなり、Service Pack と Quick Fix Engineering リリースのバイナリ互換性が向上します。
新しい仮想関数が CDocTemplate クラスに追加されました。 この新しい仮想関数は CDocTemplate::OpenDocumentFile です。 OpenDocumentFile の以前のバージョンには、2 つのパラメーターがありました。 新しいバージョンには、3 つのパラメーターがあります。 再起動マネージャーをサポートするには、CDocTemplate から派生したクラスで、3 つのパラメーターのあるバージョンを実装する必要があります。 この関数の詳細については、「CDocTemplate::OpenDocumentFile」を参照してください。 新しいパラメーターは bAddToMRU です。
マクロと環境変数
- 環境変数 __MSVCRT_HEAP_SELECT がサポートされなくなりました。 この環境変数は削除され、これに代わる変数はありません。
Microsoft Macro Assembler リファレンス
- いくつかのディレクティブが Microsoft Macro Assembler リファレンス コンパイラから削除されました。 削除されたディレクティブは、.186、.286、.286P、.287、.8086、.8087、および .NO87 です。