Visual C++ での互換性に影響する変更点
このドキュメントでは、互換性に影響する Visual Studio 2012 の Visual C++ の変更点を示します。
Visual C++ コンパイラ
/clrを使用してコンパイルされたコードでは、の enum class キーワードは、. ++11 の列挙型 (Enum) 共通言語ランタイムの (CLR) の列挙型ではなくを定義します。CLR の列挙型を定義するには、ユーザー補助について明確である必要があります。次に例を示します。
enum class ArrivalStatus // C++11 scoped enum { Late, OnTime, Early }; private enum class DepartureStatus // CLR enum (because of explicit accessibility) { Late, OnTime, Early }; void PrintStatus(ArrivalStatus arrival, DepartureStatus departure) { Console.WriteLine("Departure: {0}, Arrival: {1}", departure.ToString(), arrival.ToString() // ERROR: not a CLR enum; does not support .ToString() ); }
明示的に依存名 (C++ 言語の標準準拠場合) を一意に template のキーワードを使用します。次の例では、強調表示テンプレートのキーワードはあいまいさを解決する必要があります。詳細については、「依存型の名前解決」を参照してください。
template <typename X, typename AY> struct Container { typedef typename AY::template Rebind<X>::Other AX; };
型 float の定数式は、次の例に示すように、テンプレートの引数としては、使用できません。
template<float n> struct B {}; // error C2762: 'float': illegal type for non-type template parameter 'n' template<int n> struct A {}; A<1.1> a1; // error C2762: 'A': invalid expression as a template argument for 'n' A<(int)1.1> a2; // ok
次の擬似コードの例に示すように、ランタイムに終了を処理するための脆弱性以外であり、1 /GS のコマンド ライン オプションを使用してコンパイルする可能性のあるコードします。
char buf[MAX]; int cch; ManipulateString(buf, &cch); // ... buf[cch] = '\0'; // if cch >= MAX, process will terminate
x86 のビルドの既定のアーキテクチャは SSE2 に変更されています; したがって、コンパイラは SSE 命令を生成する可能性が浮動小数点計算の実行に XMM レジスタを使用します。以前の動作に元に戻すには、IA32 としてアーキテクチャを指定するには /arch:IA32 のコンパイラ フラグを使用します。
コンパイラは、以前に警告 C4703 と C4701 を発行する場合があります。コンパイラは、ポインター型の初期化されていないローカル変数の使用により強いチェックを追加します。
新しいリンカーの /HIGHENTROPYVA フラグが指定された場合、Windows 8 により、通常、メモリ割り当ては、64 ビットのアドレスを返します。(Windows 8の 2 GB 未満のこのような割り当ての頻繁に返されるアドレス前に)。これにより、既存のコードのポインターの切り捨てバグを公開する場合があります。既定では、このスイッチです。この動作を無効にするには、/HIGHENTROPYVA:NOを指定します。
マネージ コンパイラ (Visual Basic /C#) は、マネージのビルドの /HIGHENTROPYVA をサポートします。ただし、この場合、/HIGHENTROPYVA スイッチは既定でになります。
統合開発環境
次のプロジェクト テンプレートはありません:
Windows フォーム アプリケーション
Windows フォーム コントロール ライブラリ
C++/CLI の Windows フォーム アプリケーションを作成することが推奨されますが、ある C++/CLI の UI のアプリケーションの保守がサポートされます。Windows フォーム アプリケーション、またはそのほかの .NET アプリケーション UI は、使用、C または Visual Basic 作成する必要があります。相互運用性の目的に制限は C++/CLI を使用します。
Visual C++ のライブラリ
並列ライブラリは、同時実行ランタイム ライブラリ (PPL) をします
UmsThreadDefault の SchedulerType の列挙型の使用は推奨されていません。UmsThreadDefault の指定は ThreadSchedulerにも使用されていない警告、および内部的にマップを生成します。
標準テンプレート ライブラリ
make_pair()を呼び出す明示的なテンプレート引数を使用して C++98/03 と C++11 標準中の変更の後に、— make_pair<int, int>(x, y)では—通常 Visual Studio 2012 の Visual C++にコンパイルされます。ソリューションは make_pair(x, y)のように、明示的なテンプレート引数なしで make_pair() 常にを呼び出すことです。明示的なテンプレート引数を指定する場合は、関数の目的に反します。結果の型で正確に制御する必要がある場合は、pair<short, short>(int1, int2)のように make_pairの代わりに pair —を使用します。
C++98/03 と C++11 標準の間に別の変更: 12 A が B、および B に暗黙的に変換できる場合、C に暗黙的に変換できますが、は pair<C, X>に (暗黙的または明示的に変換される 15) B、および C++98/03 Visual C++ 2010 で許可される pair<A, X> に暗黙的に変換できるとは限りません。(そのほかは重要な型、X が、ここではなく、これが 1 番目の型とペアに固有ではありません。)は、C に暗黙的に変換できるではないことを C++11 と Visual Studio 2012 の Visual C++ が検出されるため、オーバーロードの解決のペアの変換を削除します。これは、さまざまなシナリオで正の変更があります。たとえば、func(const pair<int, int>&) と func(const pair<string, string>&)にオーバーロード、func() を pair<const char *, const char *> と呼び出してこの変更にコンパイルされます。ただし、この変更は積極的なペアの変換に使用していたコードを中断します。このようなコードは pair<C, X>を受け取る関数に make_pair(static_cast<B>(a), x) を渡すことによって例の明示的変換の 1 部分を実装して、通常、解決できます。
Visual C++ 2010 は 10 の引数の制限にプリプロセッサのマシンとクラスのオーバーロードと特殊化を押して例テンプレートの variadic、make_shared<T>(arg1, arg2, argN)—、シミュレートします。Visual Studio 2012 の Visual C++では、ユーザーの大部分のコンパイル時およびコンパイラのメモリ使用量を向上するために、この制限は、5 種類の引数に減少します。ただし、明示的に 10 と _VARIADIC_MAX を定義することによって、プロジェクト全体前の制限を設定できます。
C++11 17.6.4.3 .1 [マクロ。C++ の標準ライブラリのヘッダーが含まれる場合は、名前]/2 izing マクロのキーワードを禁止します。ヘッダーはマクロ ized のキーワードを検出すると、コンパイラ エラーを出力します。(_ALLOW_KEYWORD_MACROS を定義すると、そのようなコードがコンパイルされますが、厳密にはその使用は推奨されていません。)例外として、ヘッダーが #pragma push_macro("new")/#undef new/#pragma pop_macro("new")を使用して、包括的に自身を守るため、マクロ ized new は、既定で付与されます。_ENFORCE_BAN_OF_MACRO_NEW を定義すると、名前が示す内容と完全にします。
さまざまな最適化、デバッグ検査を実行するには、C++ の標準ライブラリの実装を意図的に Visual Studio (2005、2008、2010、2012) のバージョン間のバイナリ互換性を中断します。C++ の標準ライブラリを使用する場合、これは 1 種類の binary、異なるバージョンのを使用して (EXE または DLL) コンパイル禁止し、異なるバージョンのを使用してコンパイル binary の間での C++ 標準ライブラリのオブジェクトを渡すことを禁止しますスタティック ライブラリとオブジェクト ファイルの混合を示します。オブジェクト ファイルとスタティック ライブラリの混合 (C++ の標準ライブラリを使用) Visual Studio 2012 の Visual C++ を使用してコンパイルされたことの Visual C++ 2010 を使用してコンパイル _MSC_VER がコンパイラのメジャー バージョン (Visual Studio 2012 の Visual C++の 1700) を含むマクロである _MSC_VER の不一致に関するリンカー エラーを生成します。このチェックは DLL を混在させることを検出します Visual C++ 2008 を以前に混在を検出できません。
_ITERATOR_DEBUG_LEVEL の不一致の Visual C++ 2010で実装された検出に加えて、Visual Studio 2012 の Visual C++ は RuntimeLibrary の不一致を検出します。これらは、コンパイラ オプション /MT (静的リリース)、/MTd (静的デバッグ)、/MD (動的リリース)、および /MDd (動的デバッグ) が混在する場合に発生します。
実装が実際に有効ではありませんが、operator<()、operator>()、operator<=()と operator>=() はコンテナーの std::unordered_map と stdext::hash_map のファミリ以前に利用可能です。これらの標準演算子は Visual Studio 2012 の Visual C++から削除されました。また、operator==() の実装と std::unordered_map ファミリの operator!=() は stdext::hash_map ファミリをカバーするために拡張されました。(これは、新しいコードの stdext::hash_map ファミリを使用しないことをお勧めします。)
codecvt::length() と codecvt::do_length() が stateT& の変更可能なパラメーターを受け取る必要があることを C++11 22.4.1.4 [locale.codecvt] Visual C++ 2010 取りました const stateT&を指定します。Visual Studio 2012 の Visual C++ は、標準で要求されるように stateT& を受け取ります。この違いは do_length()仮想関数をオーバーライドしようとしている任意のユーザーにとって重要です。
CRT ライブラリ
new と malloc()に使用される C のランタイム (CRT) ヒープは、プライベートではありません。CRT は、プロセス ヒープを使用します。これは、DLL がアンロードされるときに、ヒープが、CRT に静的にある DLL コードを確認するリンクされた DLL 破棄されないことを意味して割り当てられたメモリ アンロードした前に消去されます。
iscsymf() 関数は負の値に永続化します。
threadlocaleinfostruct の構造体はロケールの関数に対する変更内容に合わせて変更されています。
memxxx()など) に対応する組み込み関数が一部の CRT 関数は、strxxx()intrin.hから削除されます。これらの関数は、にのみインクルード intrin.h、対応する CRT のヘッダーを含める必要があります。
MFC および ATL ライブラリ
Fusion の削除のサポート (afxcomctl32.h); したがって、afxcomctl32.h で定義されているすべてのメソッドは削除されました。ヘッダー ファイル afxcomctl32.h と afxcomctl32.inl が削除されました。
CDockablePane::RemoveFromDefaultPaneDividerに CDockablePane::RemoveFromDefaultPaneDividier の名前を変更。
CFileDialog::SetDefExt の定義を LPCTSTR を使用するように変更されています; このため、Unicode のビルドに影響します。
廃止されたの ATL のトレース カテゴリ。
CBasePane::MoveWindow の定義を const CRectを受け取るように変更されています。
CMFCEditBrowseCtrl::EnableBrowseButtonの定義を変更。
CMFCBaseTabCtrlから削除された m_fntTabs と m_fntTabsBold。
CMFCRibbonStatusBarPane のコンストラクターにパラメーターを追加。(これは、既定のパラメーターであるため、ソース分割されます)。
CMFCRibbonCommandsListBox のコンストラクターにパラメーターを追加。(これは、既定のパラメーターであるため、ソース分割されます)。
AFXTrackMouse API を削除し、(タイマーのプロシージャを関連付ける)。TrackMouseEvent Win32 API を使用してください。
CFolderPickerDialog のコンストラクターにパラメーターを追加。(これは、既定のパラメーターであるため、ソース分割されます)。
CFileStatus の構造体のサイズは変更されています: m_attribute のメンバーはバイトからダブル ワードに変更 (GetFileAttributes から返される値に合わせて)。
Unicode の RICHEDIT_CLASS (リッチ エディット 3.0 コントロール) の代わりにCRichEditCtrl と CRichEditView を使用 MSFTEDIT_CLASS (リッチ エディット 4.1 コントロール) がビルドされます。
これは Windows Vista、Windows 7、および Windows 8.で常に True であるため、削除された AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground。
これは Windows Vista、Windows 7、および Windows 8.で常に True であるため、削除された AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable。
削除された AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea。Windows Vista、Windows 7、および Windows 8.の Windows API を直接呼び出す。
削除された AFX_GLOBAL_DATA::DwmDefWindowProc。Windows Vista、Windows 7、および Windows 8.の Windows API を直接呼び出す。
名前の競合を解消する IsDwmCompositionEnabled への名前を変更した AFX_GLOBAL_DATA::DwmIsCompositionEnabled。
変更された ID いくつかの MFC 内部タイマーのおよび実行 afxres.h (AFX_TIMER_ID_*) に定義。
OnExitSizeMove のメソッドの定義を ON_WM_EXITSIZEMOVE マクロと一致するように変更しました:
CFrameWndEx
CMDIFrameWndEx
CPaneFrameWnd
OnDWMCompositionChanged の名前と定義を ON_WM_DWMCOMPOSITIONCHANGED マクロと一致するように変更しました:
CFrameWndEx
CMDIFrameWndEx
CPaneFrameWnd
OnMouseLeave のメソッドの定義を ON_WM_MOUSELEAVE マクロと一致するように変更しました:
CMFCCaptionBar
CMFCColorBar
CMFCHeaderCtrl
CMFCProperySheetListBox
CMFCRibbonBar
CMFCRibbonPanelMenuBar
CMFCRibbonRichEditCtrl
CMFCSpinButtonCtrl
CMFCToolBar ReplaceThisText
CMFCToolBarComboBoxEdit
CMFCToolBarEditCtrl
CMFCAutoHideBar
OnPowerBroadcast の定義を ON_WM_POWERBROADCAST マクロと一致するように変更しました:
CFrameWndEx
CMDIFrameWndEx
OnStyleChanged の定義を ON_WM_STYLECHANGED マクロと一致するように変更しました:
CMFCListCtrl
CMFCStatusBar
FontFamilyProcFontsに内部メソッド FontFamalyProcFonts の名前を変更。
削除された複数のグローバル静的 CString は、メモリ リーク (#defines で置換されます)、および次のクラスのメンバー変数を状況によっては削除するためのオブジェクトです:
CKeyBoardManager::m_strDelimiter
CMFCPropertyGridProperty::m_strFormatChar
CMFCPropertyGridProperty::m_strFormatShort
CMFCPropertyGridProperty::m_strFormatLong
CMFCPropertyGridProperty::m_strFormatUShort
CMFCPropertyGridProperty::m_strFormatULong
CMFCPropertyGridProperty::m_strFormatFloat
CMFCPropertyGridProperty::m_strFormatDouble
CMFCToolBarImages::m_strPngResType
CMFCPropertyGridProperty::m_strFormat
CKeyboardManager::ShowAllAccelerators の定義を変更し、アクセラレータの区切り記号のパラメーターを削除。
CPropertyPage のクラスを追加 CPropertyPage::GetParentSheetは、GetParent の代わりに、CPropertyPageに親または祖父母のウィンドウ上の正しいシートの親ウィンドウを取得するには、を呼び出します。GetParentの代わりに GetParentSheet を呼び出すようにコードを変更する必要があります。
誤って無効にする警告の原因となった ATLBASE.H の固定左右の #pragma warning (プッシュ)。これらの警告は、ATLBASE.H の分析後に正しく有効になります。
AFX_GLOBAL_DATA からに移動 _AFX_D2D_STATED2D 関連メソッド:
GetDirectD2dFactory
GetWriteFactory
GetWICFactory
InitD2D
ReleaseD2DRefs
IsD2DInitialized
D2D1MakeRotateMatrix
たとえば、afxGlobalData.IsD2DInitializedでは AfxGetD2DState->IsD2DInitializedを代わりに呼び出します。
\atlmfc\include\フォルダーの廃止された ATL*.CPP ファイル。
DLLMain の要件を満たす CRT の初期化時ではなく、必要に応じてへの afxGlobalData で、初期化します。
CMFCOutlookBarPane のクラスに RemoveButtonByIndex のメソッドを追加しました。
IsFrequentlyUsedCmdへの修正 CMFCCmdUsageCount::IsFreqeuntlyUsedCmd。
RestoreOriginalState (CMFCToolBar、CMFCMenuBar、CMFCOutlookBarPane) に RestoreOriginalstate の複数のインスタンスを修正。
CDockablePaneから削除された未使用のメソッド: SetCaptionStyle、IsDrawCaption、IsHideDisabledButtons、GetRecentSiblingPaneInfoと CanAdjustLayout。
削除された CDockablePane の静的メンバー変数 m_bCaptionText と m_bHideDisabledButtons。
CMFCFontComboBoxにオーバーライドの DeleteString のメソッドを追加しました。
CPaneから削除された未使用のメソッド: GetMinLength と IsLastPaneOnLastRow。
CPane::SetDockSiteRowへの名前を変更した CPane::GetDockSiteRow(CDockingPanesRow *) *)。