Partager via


Modifications avec rupture dans Visual C++

Ce document répertorie les dernières modifications apportées à Visual C++ dans Visual Studio 2012.

Compilateur Visual C++

  • Dans le code compilé à l'aide de /clr, le mot clé d' enum class définit l'enum C/C++ ++11, pas un enum du common langage runtime (CLR).Pour définir un enum du CLR, vous devez être significative concernant son accessibilité.C'est ce qu'illustre l'exemple suivant.

    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()
            );
    } 
    
  • Utilisez le mot clé d' template pour lever explicitement un nom dépendant (conformité standard C++).Dans l'exemple suivant, le mot clé en surbrillance de modèle est obligatoire pour résoudre l'ambiguïté.Pour plus d'informations, consultez Résolution de noms pour les types dépendants.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • N'est plus autorisé l'expression constante de type float comme argument template, comme indiqué dans l'exemple suivant.

    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
    
  • Le code qui est compilé à l'aide de l'option de ligne de commande des /GS et qui a hors fonction- par - un la vulnérabilité peut entraîner pour traiter l'arrêt de l'exécution, comme indiqué dans l'exemple suivant de pseudo-code.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • L'architecture par défaut pour les générations x86 est modifiée à SSE2 ; par conséquent, le compilateur peut émettre des instructions SSE de, et utilise les registres XMM pour effectuer des calculs à virgule flottante. Si vous souhaitez rétablir le comportement précédent, puis utilisez l'indicateur de compilateur d' /arch:IA32 pour spécifier l'architecture sous forme IA32.

  • Le compilateur peut émettre des avertissements C4703 et C4701 précédemment où il n'a pas effectué. Le compilateur applique des contrôles plus forts pour l'utilisation des variables locales non initialisées de type pointeur.

  • Lorsque la balise /HIGHENTROPYVA d'éditeur de liens est spécifiée, Windows 8 fait généralement retourner les allocations de mémoire une adresse 64 bits.(Avant Windows 8, ces adresses plus souvent retournées d'allocations qui étaient moins de 2 Go.) Cela peut exposer des bogues de troncation de pointeur du code existant. Par défaut, ce commutateur est activé. Pour désactiver ce comportement, spécifiez /HIGHENTROPYVA:NO.

  • Le compilateur managé (Visual Basic /C#) prend également en charge /HIGHENTROPYVA pour les générations managées.Toutefois, dans ce cas, le commutateur d' /HIGHENTROPYVA est désactivée par défaut.

Environnement de développement intégré

  • Les modèles de projet suivants n'existent plus :

    • Application Windows Forms

    • Bibliothèque de contrôles Windows Forms

  • Bien que nous recommandions que vous ne créez pas les applications Windows Forms en C++/CLI, la maintenance d'exister des applications de C++/CLI interface utilisateur est prise en charge.Si vous devez créer une application Windows Forms, ou toute autre application du .NET interface utilisateur, c de utilisation ou Visual Basic.L'utilisation C++/CLI pour l'interopérabilité purposes uniquement.

Bibliothèques Visual C++

Bb531344.collapse_all(fr-fr,VS.110).gifBibliothèque de modèles parallèles et la bibliothèque runtime d'accès concurrentiel

L'énumération d' SchedulerType d' UmsThreadDefault est déconseillée.La spécification d' UmsThreadDefault un avertissement déconseillé, et en interne des cartes à ThreadScheduler.

Bb531344.collapse_all(fr-fr,VS.110).gifBibliothèque STL (Standard Template Library)

  • Après une modification avec rupture entre les normes C++98/03 et C++11, à l'aide de les arguments template explicites pour appeler make_pair()(comme dans make_pair<int, int>(x, y)— généralement ne compile pas dans Visual C++ dans Visual Studio 2012.La solution consiste à appeler toujours make_pair() sans modèle explicite argument- comme dans make_pair(x, y).Fournissant des arguments template explicites l'occultation objectif de la fonction.Si vous avez besoin d'un contrôle précis du type résultant, utilisez pair au lieu d' make_pair(comme dans pair<short, short>(int1, int2).

  • Une autre nouveauté entre les normes C++98/03 et C++11 : Lorsqu'Un est implicitement convertible à B et B est implicitement convertible à C, mais n'est pas implicitement convertible à C, à C++98/03 et à pair<A, X> autorisé par Visual C++ 2010 à convertir (implicitement ou explicitement) à pair<C, X>.(L'autre type, X, n'est pas d'intérêt ici, et ce n'est pas spécifique au premier dans les paires.) Étant donné que C++11 et Visual C++ dans Visual Studio 2012 les détectent qu'Un n'est pas implicitement convertible à C, ils suppriment la conversion de paires de la résolution de surcharge.Il s'agit d'une modification positive pour de nombreux scénarios.Par exemple, surchargeant func(const pair<int, int>&) et func(const pair<string, string>&), et l'appel func() avec pair<const char *, const char *> compilera à cette modification.Toutefois, cette modification déchiffre le code qui est compté sur les conversions agressives de paires.Ce code peut généralement être résolu en effectuant une partie de la conversion explicite- pour l'exemple, en passant make_pair(static_cast<B>(a), x) à une fonction qui attend pair<C, X>.

  • Visual C++ 2010 est simulé variadic descripteur- pour l'exemple, make_shared<T>(arg1, arg2, argN)— à la limite de 10 arguments, en emboutissant des surcharges et les spécialisations avec des machines de préprocesseur.Dans Visual C++ dans Visual Studio 2012, cette limite est réduite à 5 arguments pour améliorer les temps de la compilation et la consommation de mémoire de compilateur pour la plupart des utilisateurs.Toutefois, vous pouvez définir la limite précédente en définissant explicitement _VARIADIC_MAX comme 10, spécifiques à l'échelle.

  • C++11 17.6.4.3 .1 [macro.] de noms/2 interdit les mots clés du - izing lorsque les en-têtes standard de bibliothèque C++ sont inclus.Les en-têtes émettent maintenant des erreurs du compilateur s'ils détectent les mots clés du - ized.(Définition _ALLOW_KEYWORD_MACROS permet un tel code à la compilation, mais nous décourageons fortement cette utilisation.) Comme une exception, le ized - new est autorisée par défaut, parce que les en-têtes se défendent largement à l'aide de #pragma push_macro("new")/#undef new/#pragma pop_macro("new").Définir _ENFORCE_BAN_OF_MACRO_NEW est exactement ce que son nom l'indique.

  • Pour implémenter différentes optimisations et contrôles de débogage, l'implémentation standard de bibliothèque C++ casse intentionnellement la compatibilité binaire entre les versions de Visual Studio (2005, 2008, 2010, 2012).Lorsque la bibliothèque C++ standard est utilisée, cela interdit le mélange de fichiers objets et des bibliothèques statiques qui sont compilés à l'aide de versions différentes dans un fichier binaire (EXE ou DLL), et interdit passer des objets standard de bibliothèque C++ entre les fichiers binaires compilés à l'aide de versions différentes.Le mélange de fichiers objets et des bibliothèques statiques (à l'aide de la bibliothèque C++ standard) qui ont été compilés à l'aide de Visual C++ 2010 avec ceux qui ont été compilés à l'aide de Visual C++ dans Visual Studio 2012 émet des erreurs d'éditeur de liens sur l'incompatibilité d' _MSC_VER, où _MSC_VER est le qui contient la version principale du compilateur (1700 pour Visual C++ dans Visual Studio 2012).Ce contrôle ne peut pas détecter le mélange de DLL, et ne peut pas détecter le mélange qui implique Visual C++ 2008 ou précédemment.

  • En plus de détecter les incompatibilités d' _ITERATOR_DEBUG_LEVEL, qui a été implémenté dans Visual C++ 2010, Visual C++ dans Visual Studio 2012 détecte les incompatibilités de RuntimeLibrary.Ceux-ci se produisent lorsque les options du compilateur /MT (version finale statique), /MTd (static debug), /MD (version finale dynamique), et /MDd (la dynamique debug) sont associées.

  • operator<(), operator>(), operator<=(), et operator>=() étaient précédemment disponibles pour les familles de std::unordered_map et d' stdext::hash_map des conteneurs, bien que leurs implémentations n'ont pas été réellement utiles.Ces opérateurs non standard ont été supprimés dans Visual C++ dans Visual Studio 2012.En outre, l'implémentation d' operator==() et operator!=() pour la famille d' std::unordered_map a été étendue pour couvrir la famille d' stdext::hash_map .(Nous vous recommandons d'éviter l'utilisation de la famille d' stdext::hash_map dans le nouveau code.)

  • C++11 22.4.1.4 [locale.codecvt] spécifie qu' codecvt::length() et codecvt::do_length() doivent prendre des paramètres modifiables d' stateT&, mais Visual C++ 2010 a pris const stateT&.Visual C++ dans Visual Studio 2012 prend stateT& comme requis par la norme.Cette différence est important pour toute personne qui tente de substituer une fonction virtuelle do_length().

Bb531344.collapse_all(fr-fr,VS.110).gifCRT Library

  • Le tas runtime C (CRT), qui est utilisé pour new et malloc(), n'est plus privé.Le CRT utilise désormais le tas de processus.Cela signifie que le tas n'est pas détruit lorsque une DLL est déchargé, les DLL liées de manière statique au CRT doivent garantir la mémoire allouée par le code de la DLL est nettoyée avant qu'il soit déchargé.

  • Les assertions de fonction d' iscsymf() avec les valeurs négatives.

  • La structure d' threadlocaleinfostruct a changé pour s'adapter aux modifications aux fonctions de paramètres régionaux.

  • Les fonctions CRT qui ont des intrinsèques correspondantes telles que memxxx(), strxxx() sont supprimées de intrin.h.Si vous intrin.h inclus uniquement pour les fonctions, vous devez maintenant inclure les en-têtes correspondants CRT.

Bb531344.collapse_all(fr-fr,VS.110).gifBibliothèques MFC et ATL

Prise en charge supprimé de fusion (afxcomctl32.h) ; par conséquent, toutes les méthodes définies dans afxcomctl32.h ont été supprimées.Les fichiers d'en-tête afxcomctl32.h et afxcomctl32.inl ont été supprimés.

A modifié le nom d' CDockablePane::RemoveFromDefaultPaneDividier à CDockablePane::RemoveFromDefaultPaneDivider.

Révision de la signature d' CFileDialog::SetDefExt pour utiliser LPCTSTR ; par conséquent, les builds Unicode sont affectées.

ATL obsolète suivant les catégories.

Révision de la signature d' CBasePane::MoveWindow pour prendre CRectconst.

Révision de la signature d' CMFCEditBrowseCtrl::EnableBrowseButton.

m_fntTabs supprimé et m_fntTabsBold d' CMFCBaseTabCtrl.

Ajout d'un paramètre aux constructeurs d' CMFCRibbonStatusBarPane .(C'est un paramètre par défaut, et il source- n'arrête pas.)

Ajout d'un paramètre au constructeur d' CMFCRibbonCommandsListBox .(C'est un paramètre par défaut, et il source- n'arrête pas.)

A supprimé l'API d' AFXTrackMouse (et associé la procédure timer).Utilisez l'API Win32 TrackMouseEvent à la place.

Ajout d'un paramètre au constructeur d' CFolderPickerDialog .(C'est un paramètre par défaut, et il source- n'arrête pas.)

taille de structure d'CFileStatus modifiée : Le membre d' m_attribute a été modifiée entre OCTET au valeur DWORD (pour correspondre à la valeur retournée d' GetFileAttributes).

CRichEditCtrl et utilisation MSFTEDIT_CLASS (RichEdit 4,1 d' CRichEditView de contrôle) au lieu des builds de RICHEDIT_CLASS (contrôle RichEdit 3,0) au format Unicode.

AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground supprimé car il est toujours VRAI sur Windows Vista, Windows 7, et windows 8.

AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable supprimé car il est toujours VRAI sur Windows Vista, Windows 7, et windows 8.

AFX_GLOBAL_DATA::DwmExtendFrameIntoClientAreasupprimé.Appeler l'API Windows directement sur Windows Vista, Windows 7, et windows 8.

AFX_GLOBAL_DATA::DwmDefWindowProcsupprimé.Appeler l'API Windows directement sur Windows Vista, Windows 7, et windows 8.

AFX_GLOBAL_DATA::DwmIsCompositionEnabled renommé à IsDwmCompositionEnabled pour supprimer une collision de nom.

ID modifiés pour autant d'horloges internes MFC et déplacés les définitions à afxres.h (AFX_TIMER_ID_*).

Révision de la signature de la méthode d' OnExitSizeMove pour être d'accord avec le d'ON_WM_EXITSIZEMOVE :

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

A modifié le nom et la signature d' OnDWMCompositionChanged pour être d'accord avec le d'ON_WM_DWMCOMPOSITIONCHANGED :

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Révision de la signature de la méthode d' OnMouseLeave pour être d'accord avec le d'ON_WM_MOUSELEAVE :

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Révision de la signature d' OnPowerBroadcast pour être d'accord avec le d'ON_WM_POWERBROADCAST :

  • CFrameWndEx

  • CMDIFrameWndEx

Révision de la signature d' OnStyleChanged pour être d'accord avec le d'ON_WM_STYLECHANGED :

  • CMFCListCtrl

  • CMFCStatusBar

A renommé la méthode interne FontFamalyProcFonts à FontFamilyProcFonts.

Nombreux objets statiques globales supprimés d' CString pour éviter des fuites de mémoire dans certains cas (remplacé par des #defines), et les variables suivantes de membre de classe :

  • 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

Révision de la signature d' CKeyboardManager::ShowAllAccelerators et a supprimé le paramètre de séparateur d'accélérateur.

CPropertyPage::GetParentSheetajouté, et dans la classe d' CPropertyPage, l'appel au lieu d' GetParent pour obtenir la fenêtre parente correcte de feuille, qui peut être le parent ou une fenêtre de grand-parent à CPropertyPage.Vous devrez peut-être modifier votre code pour appeler GetParentSheet au lieu d' GetParent.

Avertissement non équilibré fixe #pragma (transmission de type push) dans ATLBASE.H, qui a provoqué les avertissements d'être désactivé de façon incorrecte.Ces avertissements sont maintenant activés correctement après ATLBASE.H a été analysé.

Méthodes déplacées de D2D-related d' AFX_GLOBAL_DATA à _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Au lieu d'appeler, par exemple, afxGlobalData.IsD2DInitialized, appelez AfxGetD2DState->IsD2DInitialized.

Les fichiers obsolètes supprimés d'ATL*.CPP du\atlmfc\d'incluent\dossiers.

Initialisation déplacée d' afxGlobalData à la demande et non au moment de l'initialisation du CRT, de respecter des exigences de DLLMain.

Ajout de la méthode d' RemoveButtonByIndex à la classe d' CMFCOutlookBarPane .

CMFCCmdUsageCount::IsFreqeuntlyUsedCmd corrigé à IsFrequentlyUsedCmd.

Correction de plusieurs instances d' RestoreOriginalstate à RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Méthodes inutilisées suppression d' CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, et CanAdjustLayout.

Variables membres statiques supprimés m_bCaptionText et m_bHideDisabledButtonsd' CDockablePane .

Ajout d'une méthode d' DeleteString de priorité à CMFCFontComboBox.

Méthodes inutilisées suppression d' CPane: GetMinLength et IsLastPaneOnLastRow.

CPane::GetDockSiteRow(CDockingPanesRow *) renommé à CPane::SetDockSiteRow.

Voir aussi

Autres ressources

Mise en route de Visual C++ dans Visual Studio 2012