Fundamentalne zmiany w Visual C++
Ten dokument zawiera listę zmiany podziału Visual C++ w programie Visual Studio 2012.
Kompilator Visual C++
W kodzie, który jest kompilowana przy użyciu /clr, enum class słowo kluczowe definiuje C ++ 11 enum, nie wspólnej language runtime (CLR) enum.Aby zdefiniować CLR enum, musi być wyraźnie o ich dostępności.Poniższy przykład ilustruje to.
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() ); }
Użycie template słowa kluczowego, aby wyraźnie odróżnić zależnych nazwy (zgodności ze standardem języka C++).W poniższym przykładzie szablon wyróżnionego słowa kluczowego jest obowiązkowe rozwiązania niejasności.Aby uzyskać więcej informacji, zobacz Rozpoznawanie nazw dla typów zależnych.
template <typename X, typename AY> struct Container { typedef typename AY::template Rebind<X>::Other AX; };
Wyrażenie stałe typu float nie jest już dozwolone jako argument szablonu, jak pokazano w poniższym przykładzie.
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
Kod, który jest kompilowana przy użyciu /GS opcji wiersza polecenia i że ma się po drugim luki w zabezpieczeniach może prowadzić do przetwarzania zakończenia w czasie wykonywania, jak pokazano w poniższym przykładzie pseudo-kod.
char buf[MAX]; int cch; ManipulateString(buf, &cch); // ... buf[cch] = '\0'; // if cch >= MAX, process will terminate
Architektura domyślne dla architektury x 86 buduje zostaje zmieniony na SSE2; w związku z tym kompilator może emitować Instrukcje SSE i umożliwia wykonywanie obliczeń zmiennoprzecinkowych rejestrów XMM. Jeżeli chcesz powrócić do poprzedniego zachowanie, użyj /arch:IA32 flagi kompilatora, aby określić architektura jako IA32.
Kompilator może wydać ostrzeżenia C4703 i C4701, gdzie poprzednio nie. Kompilator stosuje się silniejsze sprawdza, czy stosowania niezainicjowanych zmiennych lokalnych typu wskaźnika.
Kiedy nowy program łączący flaga /HIGHENTROPYVA jest określony, Windows 8 zazwyczaj powoduje przydzielania pamięci powrócić do adresu 64-bitowego.(Przed Windows 8, takich przydziałów częściej zwracane adresy, które były mniej niż 2 GB.) Może to narazić wskaźnik błędów obcinania w istniejący kod. Domyślnie ten przełącznik jest na. Aby wyłączyć to zachowanie, należy określić /HIGHENTROPYVA:NO.
Kompilator zarządzanych (Visual Basic / C#) obsługuje również /HIGHENTROPYVA dla zarządzanych buduje.Jednakże, w tym przypadku /HIGHENTROPYVA przełącznik jest domyślnie wyłączona.
Zintegrowane środowisko programistyczne
Następujące szablony projektu już nie istnieją:
Aplikacji Windows Forms
Biblioteka formantów systemu Windows Forms
Chociaż firma Microsoft zaleca, aby nie utworzyć aplikacje Windows Forms C + +/ CLI, utrzymanie istniejących C + +/ CLI interfejsu użytkownika aplikacji jest obsługiwany.Jeśli masz do tworzenia aplikacji Windows Forms lub dowolnej innej aplikacji .NET interfejsu użytkownika, należy użyć języka C# lub Visual Basic.Użyj C + +/ CLI ze względu na współdziałanie tylko do celów.
Visual C++ bibliotek
Równoległe Biblioteka wzorców i biblioteka wykonawcza współbieżności
SchedulerType Wyliczenie UmsThreadDefault jest przestarzały.Specyfikacja UmsThreadDefault produkuje niewskazany ostrzeżenie, a wewnętrznie mapuje powrót do ThreadScheduler.
Standardowa biblioteka szablonów
Po zmiana podziału między C ++ 98/03 i C ++ norm 11, przy użyciu szablonu jawne argumentów do wywołania make_pair()— podobnie jak w make_pair<int, int>(x, y)— zazwyczaj nie zostałby skompilowany w Visual C++ w programie Visual Studio 2012.Rozwiązaniem jest zawsze wywołuje się make_pair() bez argumentów jawne szablonu — podobnie jak w make_pair(x, y).Zapewnienie porażek argumenty szablonu jawne celem funkcji.Jeśli wymagane jest dokładną kontrolę typu Wynikowe, należy użyć pair zamiast make_pair— podobnie jak w pair<short, short>(int1, int2).
Zmiana innego podziału między C ++ 98/03 i C ++ norm 11: gdy A jest niejawnie konwertowane B i B jest niejawnie-C, ale nie jest niejawnie konwertowane C, C ++ 98/03 i Visual C++ 2010 dozwolone pair<A, X> do konwersji (jawnie lub niejawnie) do pair<C, X>.(Typ, X, nie jest z odsetek w tym miejscu, a nie jest to specyficzne dla pierwszego typu w parze.) Ponieważ C ++ 11 i Visual C++ w programie Visual Studio 2012 wykryć, że nie jest niejawnie konwertowane C, usuwają konwersja pary z wiązaniem.Jest to pozytywne zmiany w wielu scenariuszach.Na przykład przeciążanie func(const pair<int, int>&) i func(const pair<string, string>&), a wywołanie func() z pair<const char *, const char *> skompiluje się z tą zmianą.Jednak ta zmiana powoduje przerwanie kod, który opierała się na parę agresywne konwersji.Takiego kodu – zazwyczaj można ustalić, wykonując jedną część konwersji jawnie — na przykład, przekazując make_pair(static_cast<B>(a), x) do funkcji, która oczekuje pair<C, X>.
Visual C++ 2010Symulowane zmienne szablony — na przykład, make_shared<T>(arg1, arg2, argN)— do limitu 10 argumentów, przez wybijanie przeciążeń i specjalności z maszyny preprocesora.W Visual C++ w programie Visual Studio 2012, limit ten jest ograniczona do 5 argumenty usprawniających czasu kompilacji i zużycie pamięci kompilatora dla większości użytkowników.Jednakże, można ustawić limit poprzedniego jawnie definiując _VARIADIC_MAX jako 10, projektu wide.
C ++ 11 17.6.4.3.1 [makro.nazwy] / 2 zabrania słowa kluczowe izing makro, gdy nagłówki standardowa biblioteka języka C++ są uwzględniane.Nagłówki teraz emitują błędy kompilatora, jeśli wykryją słowa kluczowe ized makro.(Definiowanie _ALLOW_KEYWORD_MACROS pozwala takiego kodu skompilować, ale zdecydowanie odradzamy czy wykorzystanie.) W drodze wyjątku makro ized new jest dozwolone domyślnie, ponieważ nagłówki kompleksowo bronić za pomocą #pragma push_macro("new")/#undef new/#pragma pop_macro("new").Definiowanie _ENFORCE_BAN_OF_MACRO_NEW czy dokładnie to, co sugeruje jego nazwa.
Aby zaimplementować różne optymalizacje i debugowania kontroli, wykonania standardowa biblioteka języka C++ celowo przerwy binarne zgodność między wersjami Visual Studio (2005, 2008, 2010, 2012).Gdy używana jest standardowa biblioteka języka C++, to zabrania mieszania plików obiektu i statycznych bibliotek, które są kompilowane przy użyciu różnych wersji do jednego kodu binarnego (plik EXE lub DLL), a zabrania na przekazywanie standardowa biblioteka obiektów między pliki binarne, które są zestawiane przy użyciu różnych wersji.Mieszania plików obiektu i statyczne biblioteki (za pomocą standardowa biblioteka języka C++), które zostały skompilowane przy użyciu Visual C++ 2010 z tymi, które zostały skompilowane przy użyciu Visual C++ w programie Visual Studio 2012 emituje błędy programu łączącego o _MSC_VER niezgodność, gdzie _MSC_VER jest makro, które zawiera główny numer wersji kompilatora (1700 dla Visual C++ w programie Visual Studio 2012).Ten test nie może wykryć biblioteki DLL mieszania, a nie może wykryć mieszania, który polega na Visual C++ 2008 lub wcześniej.
Oprócz wykrywania _ITERATOR_DEBUG_LEVEL niezgodności, które zostało wprowadzone w życie w Visual C++ 2010, Visual C++ w programie Visual Studio 2012 wykryje niezgodności RuntimeLibrary.Te występują podczas opcje kompilatora /MT (release statyczny), /MTd (debugowanie statyczny), /MD (release dynamiczne), i /MDd (debugowanie dynamiczne) są wymieszane.
operator<(), operator>(), operator<=(), i operator>=() wcześniej były dostępne dla std::unordered_map i stdext::hash_map rodzin kontenerów, mimo że ich implementacji nie były rzeczywiście przydatne.Tych operatorów niestandardowe zostały usunięte w Visual C++ w programie Visual Studio 2012.Dodatkowo, wykonania operator==() i operator!=() dla std::unordered_map rodziny został rozszerzony i obejmuje stdext::hash_map rodziny.(Firma Microsoft zaleca, aby uniknąć korzystania z stdext::hash_map rodziny w nowym kodzie.)
C ++ 11 22.4.1.4 [locale.codecvt] Określa, że codecvt::length() i codecvt::do_length() powinny podjąć modyfikowane przez stateT& parametry, ale Visual C++ 2010 miały const stateT&.Visual C++ w programie Visual Studio 2012Trwa stateT& zgodnie z mandatem zgodne ze standardem.Ta różnica jest istotna dla każdego, kto próbuje zastąpić funkcję wirtualną do_length().
CRT Library
Sterty C Runtime (CRT), który jest używany do new i malloc(), nie jest już prywatnych.CRT używa teraz sterty procesu.Oznacza to, że sterta nie jest niszczony, kiedy biblioteka DLL jest zwalniana, więc bibliotek DLL, które statycznie połączyć CRT musi zapewnić pamięci przydzielony przez kod biblioteki DLL jest czyszczona przed zostało zwolnione.
iscsymf() Twierdzi funkcja o wartościach ujemnych.
threadlocaleinfostruct Struct zmienił się na stopniowym zmianom funkcje ustawień regionalnych.
Funkcji CRT, które takich jak odpowiedni intrinsics memxxx(), strxxx() są usuwane z intrin.h.Jeśli dołączasz intrin.h tylko do tych funkcji, musi teraz zawierać odpowiednie nagłówki CRT.
MFC i biblioteki ATL
Usunąłeś wsparcie syntezy jądrowej (afxcomctl32.h); w związku z tym zostały usunięte wszystkie metody, które są zdefiniowane w afxcomctl32.h.Nagłówek pliki afxcomctl32.h i afxcomctl32.inl mógł zostać usunięty.
Zmieniona jego nazwa CDockablePane::RemoveFromDefaultPaneDividier do CDockablePane::RemoveFromDefaultPaneDivider.
Zmienić podpis CFileDialog::SetDefExt obsłudze LPCTSTR; w związku z tym buduje Unicode ulegają zmianie.
Usunięte kategorie śledzenia ATL przestarzałe.
Zmienić podpis CBasePane::MoveWindow do podjęcia const CRect.
Zmienić podpis CMFCEditBrowseCtrl::EnableBrowseButton.
Removed m_fntTabs and m_fntTabsBold from CMFCBaseTabCtrl.
Dodatkowy parametr do CMFCRibbonStatusBarPane konstruktorów.(To parametr domyślny, a więc nie jest źródło z ostatniej chwili).
Dodatkowy parametr do CMFCRibbonCommandsListBox Konstruktor.(To parametr domyślny, a więc nie jest źródło z ostatniej chwili).
Usunięto AFXTrackMouse interfejsu API (i pokrewne czasomierza proc).Użyj Win32 TrackMouseEvent interfejsu API zamiast.
Dodatkowy parametr do CFolderPickerDialog Konstruktor.(To parametr domyślny, a więc nie jest źródło z ostatniej chwili).
CFileStatusStruktura rozmiar zmienił się: m_attribute Członkowskich zmiany z BAJT na DWORD (Aby dopasować wartość, która jest zwracana z GetFileAttributes).
CRichEditCtrli CRichEditView MSFTEDIT_CLASS (formantu RichEdit 4.1), a nie RICHEDIT_CLASS (formantu RichEdit 3.0) w programie wersje Unicode.
Usunięto AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground ponieważ zawsze jest ważne w przypadku systemu Windows Vista, Windows 7 i 8 systemu Windows.
Usunięto AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable ponieważ zawsze jest ważne w przypadku systemu Windows Vista, Windows 7 i 8 systemu Windows.
Removed AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea.Wywołanie Windows API bezpośrednio w systemie Windows Vista, Windows 7 i 8 w systemie Windows.
Removed AFX_GLOBAL_DATA::DwmDefWindowProc.Wywołanie Windows API bezpośrednio w systemie Windows Vista, Windows 7 i 8 w systemie Windows.
Zmieniona nazwa AFX_GLOBAL_DATA::DwmIsCompositionEnabled do IsDwmCompositionEnabled wyeliminowanie kolizji nazw.
Zmienić identyfikatory dla wielu zegary wewnętrzne MFC i przeniesiona definicje afxres.h (AFX_TIMER_ID_*).
Zmienić podpis OnExitSizeMove metoda do uzgodnienia z makra ON_WM_EXITSIZEMOVE:
CFrameWndEx
CMDIFrameWndEx
CPaneFrameWnd
Zmieniono nazwę i podpis OnDWMCompositionChanged do uzgodnienia z makra ON_WM_DWMCOMPOSITIONCHANGED:
CFrameWndEx
CMDIFrameWndEx
CPaneFrameWnd
Zmienić podpis OnMouseLeave metoda do uzgodnienia z makra ON_WM_MOUSELEAVE:
CMFCCaptionBar
CMFCColorBar
CMFCHeaderCtrl
CMFCProperySheetListBox
CMFCRibbonBar
CMFCRibbonPanelMenuBar
CMFCRibbonRichEditCtrl
CMFCSpinButtonCtrl
CMFCToolBar ReplaceThisText
CMFCToolBarComboBoxEdit
CMFCToolBarEditCtrl
CMFCAutoHideBar
Zmienić podpis OnPowerBroadcast do uzgodnienia z makra ON_WM_POWERBROADCAST:
CFrameWndEx
CMDIFrameWndEx
Zmienić podpis OnStyleChanged do uzgodnienia z makra ON_WM_STYLECHANGED:
CMFCListCtrl
CMFCStatusBar
Zmieniona metoda wewnętrznego FontFamalyProcFonts do FontFamilyProcFonts.
Usunięty liczne globalne statyczne CString obiektów, aby wyeliminować pamięci przecieków w niektórych sytuacjach (zastąpione # definiuje), i następujące klasy zmienne składowe:
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
Zmienić podpis CKeyboardManager::ShowAllAccelerators i usunięto parametr ogranicznik accelerator.
Dodane CPropertyPage::GetParentSheeti w CPropertyPage klasę, nazwać zamiast GetParent Aby uzyskać okno Arkusz poprawne nadrzędnego, który może być elementem nadrzędnym lub okna dziadkowie do CPropertyPage.Być może trzeba zmienić swój kod, aby wywołać GetParentSheet zamiast GetParent.
Poprawiono nierównomierną #pragma warning(push) w ATLBASE.H, co spowodowało ostrzeżenia, które mają zostać wyłączone niepoprawnie.Ostrzeżenia te dostępne są teraz prawidłowo po ATLBASE.H był analizowany.
Przeniesione związanych z D2D metody z AFX_GLOBAL_DATA do _AFX_D2D_STATE:
GetDirectD2dFactory
GetWriteFactory
GetWICFactory
InitD2D
ReleaseD2DRefs
IsD2DInitialized
D2D1MakeRotateMatrix
Zamiast wywoływania, na przykład, afxGlobalData.IsD2DInitialized, call AfxGetD2DState->IsD2DInitialized.
Usunięto przestarzały ATL *.CPP pliki z folderu \atlmfc\include\.
Przeniesione afxGlobalData procesu inicjalizacji na żądanie a nie w czasie inicjowania CRT, aby spełnić wymagania funkcji DLLMain.
Dodane RemoveButtonByIndex metodę w celu CMFCOutlookBarPane klasy.
Corrected CMFCCmdUsageCount::IsFreqeuntlyUsedCmd to IsFrequentlyUsedCmd.
Corrected several instances of RestoreOriginalstate to RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).
Removed unused methods from CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, and CanAdjustLayout.
Usunięto CDockablePane statyczne zmienne składowe m_bCaptionText i m_bHideDisabledButtons.
Dodane przesłonięcie DeleteString metodę w celu CMFCFontComboBox.
Usunąć nieużywane metody z CPane: GetMinLength i IsLastPaneOnLastRow.
Renamed CPane::GetDockSiteRow(CDockingPanesRow *) to CPane::SetDockSiteRow.