Share via


Modifications avec rupture dans Visual C++

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

Compilateur Visual C++

  • Le mot clé auto a une nouvelle signification par défaut. Étant donné que l'utilisation de l'ancienne signification est rare, la plupart des applications ne seront pas affectées par cette modification.

  • Le nouveau mot clé static_assert est introduit, ce qui entraîne un conflit de nom s'il y a déjà un identificateur de ce nom dans votre code.

  • La prise en charge de la nouvelle notation lambda exclut la prise en charge du codage d'un GUID sans guillemet dans un attribut uuid IDL.

  • .NET Framework 4 introduit le concept d'exceptions d'état endommagé, qui sont des exceptions qui laissent un processus dans un état endommagé irrécupérable. Par défaut, vous ne pouvez pas intercepter d'exception d'état endommagé, même avec l'option de compilateur /EHa qui intercepte toutes les autres exceptions.

    Pour intercepter explicitement une exception d'état endommagé, utilisez les instructions __try-__except. Sinon, appliquez l'attribut [HandledProcessCorruptedStateExceptions] pour permettre à une fonction d'intercepter des exceptions d'état endommagé.

    Cette modification affecte essentiellement les programmeurs système qui devront peut-être intercepter une exception d'état endommagé. Les huit exceptions sont STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION et STATUS_UNWIND_CONSOLIDATE. Pour plus d'informations sur ces exceptions, consultez la macro GetExceptionCode.

  • L'option de compilateur /GS modifiée protège contre les dépassements de mémoire tampon d'une manière plus complète que dans les versions antérieures. Cette version peut introduire des vérifications de la sécurité supplémentaires dans la pile, ce qui peut réduire les performances. Utilisez le nouveau mot clé __declspec(safebuffers) pour indiquer au compilateur de ne pas insérer de vérifications de la sécurité pour une fonction particulière.

  • Si vous utilisez à la fois les options de compilateur /GL (Optimisation de l'ensemble du programme) et /clr (Compilation pour le Common Language Runtime), l'option /GL est ignorée. Cette modification a été apportée parce que la combinaison d'options de compilateur offre peu d'avantages. Suite à cette modification, les performances de la génération se sont améliorées.

  • Par défaut, la prise en charge des trigraphes est désactivée dans Visual C++ 2010. Utilisez l'option de compilateur /Zc:trigraphs pour activer la prise en charge des trigraphes. Un trigraphe se compose de deux points d'interrogation consécutifs (??) suivis d'un troisième caractère unique. Le compilateur remplace un trigraphe par un caractère de ponctuation correspondant. Par exemple, le compilateur remplace le trigraphe ??= par le signe dièse (#). Utilisez des trigraphes dans les fichiers sources C qui utilisent un jeu de caractères qui ne contient pas de représentation graphique pour certains caractères de ponctuation.

  • L'Éditeur de liens ne prend plus en charge l'optimisation pour Windows 98. L'option /OPT (Optimisations) produit une erreur de compilation si vous spécifiez /OPT:WIN98 ou /OPT:NOWIN98.

  • Les options de compilateur par défaut spécifiées par les propriétés de système de génération RuntimeLibrary et DebugInformationFormat ont été modifiées. Par défaut, ces propriétés de génération sont spécifiées dans les projets créés par Visual C++ versions 7.0 à 10.0. Si vous migrez un projet créé par Visual C++ 6.0, déterminez s'il est nécessaire de spécifier une valeur pour ces propriétés.

    Dans Visual C++ 2010, RuntimeLibrary = MultiThreaded (/MD) et DebugInformationFormat = ProgramDatabase (/Zi). Dans Visual C++ 9.0, RuntimeLibrary = MultiThreaded (/MT) et DebugInformationFormat = Désactivé.

CLR (Common Language Runtime)

  • Les compilateurs Microsoft C# et Visual Basic peuvent désormais produire un assembly non-PIA (Primary Interop Assembly). Un assembly non-PIA peut utiliser des types COM sans le déploiement de l'assembly PIA (Primary Interop Assembly) pertinent. Lors de la consommation des assemblys non-PIA produits par Visual C# ou Visual Basic, vous devez référencer l'assembly PIA sur la commande de compilation avant de référencer un assembly non-PIA qui utilise la bibliothèque.

Projets Visual C++ et MSBuild

  • Les projets Visual C++ sont désormais basés sur l'outil MSBuild. Par conséquent, les fichiers projet utilisent un nouveau format de fichier XML et un suffixe de fichier .vcxproj. Visual C++ 2010 convertit automatiquement les fichiers projet des versions antérieures de Visual Studio vers le nouveau format de fichier.

    Un projet existant est affecté s'il dépend de l'outil de génération précédent, VCBUILD.exe, ou le suffixe de fichier projet, .vcproj.

  • Dans les versions antérieures, Visual C++ prenait en charge l'évaluation tardive des feuilles de propriétés. Par exemple, une feuille de propriétés parent pouvait importer une feuille de propriétés enfant, et le parent pouvait utiliser une variable définie dans l'enfant pour définir d'autres variables. L'évaluation tardive permettait au parent d'utiliser la variable enfant avant même que la feuille de propriétés enfant ne soit importée. Dans Visual C++ 2010, une variable de la feuille du projet ne peut pas être utilisée avant d'être définie parce que MSBuild prend uniquement en charge l'évaluation précoce.

Environnement de développement intégré

  • La boîte de dialogue de fin de l'application n'arrête plus une application.

    Dans les versions précédentes, lorsque la fonction abort() ou terminate() fermait la version commerciale d'une application, la bibliothèque Runtime C affichait un message d'arrêt de l'application dans une fenêtre de console ou une boîte de dialogue. Le message indiquait que l'application avait demandé la fin de son exécution d'une façon inhabituelle. Veuillez contacter l'équipe du support technique de l'application pour plus d'informations ».

    Le message d'arrêt de l'application était redondant parce que Windows affichait ensuite le gestionnaire de terminaisons actif qui était habituellement la boîte de dialogue Rapport d'erreurs Windows (Dr. Watson) ou le débogueur Visual Studio. À partir de Visual Studio 2010, la bibliothèque Runtime C n'affiche plus le message. En outre, l'exécution empêche l'application de se terminer avant le démarrage d'un débogueur.

    Il s'agit d'une modification avec rupture uniquement si vous dépendez du comportement précédent du message d'arrêt de l'application.

  • Dans le cas particulier de Visual Studio 2010, Intellisense ne fonctionne pas pour les attributs ou le code C++/CLI, Rechercher toutes les références ne fonctionne pas pour les variables locales, et Code Model ne récupère pas de noms de type d'assemblys importés ni ne résout de types dans leurs noms qualifiés complets.

Bibliothèques Visual C++

  • La classe SafeInt est incluse dans Visual C++ et n'est plus disponible en téléchargement séparé. Il s'agit d'une modification avec rupture uniquement si vous avez développé une classe qui est également nommée « SafeInt ».

  • Le modèle de déploiement de bibliothèques n'utilise plus les manifestes pour rechercher une version particulière d'une bibliothèque de liens dynamiques. À la place, le nom de chaque bibliothèque de liens dynamiques contient son numéro de version, et vous utilisez ce nom pour trouver la bibliothèque. Pour plus d'informations, consultez Déploiement dans Visual C++ 2010.

  • Dans les versions précédentes de Visual Studio, vous pouviez régénérer les bibliothèques runtime. Visual C++ 2010 ne prend plus en charge la génération de vos propres copies des fichiers de la bibliothèque Runtime C.

Bibliothèque STL (Standard Template Library)

  • L'en-tête <iterator> n'est plus inclus automatiquement par de nombreux fichiers d'en-tête. Au lieu de cela, incluez cet en-tête explicitement si vous avez besoin d'une prise en charge pour les itérateurs autonomes définis dans l'en-tête <interator>.

  • Dans l'en-tête <algorithm>, les fonctions unchecked_* et checked_* sont supprimées. Et, dans l'en-tête <iterator>, la classe checked_iterator est supprimée, tandis que la classe unchecked_array_iterator a été ajoutée.

  • Le constructeur CComPtr::CComPtr(int) est supprimé. Ce constructeur permettait de construire un objet CComPtr à partir de la macro NULL, mais était inutile et permettait des constructions absurdes à partir d'entiers non nuls.

    Un objet CComPtr peut toujours être construit à partir de la macro NULL, qui a la valeur 0, mais échouera s'il est construit à partit d'un entier autre que le littéral 0. Vous rencontrerez très probablement ce problème dans la situation décrite par le pseudo-code suivant.

    pair<X, CComPtr<T>> myVar;
    myVar = make_pair(x, NULL);
    

    Pour résoudre la deuxième instruction, utilisez le mot clé nullptr au lieu de la macro NULL.

    myVar = make_pair(x, nullptr)
    
  • Les fonctions membres ctype suivantes ont été supprimées : ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s. Si une application utilise l'une de ces fonctions membres, vous devez la remplacer par la version non sécurisée correspondante : ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.

Bibliothèques CRT, MFC et ATL

  • La prise en charge de la génération des bibliothèques CRT, MFC et ATL par les utilisateurs a été supprimée. Par exemple, un fichier nmake approprié n'est pas fourni. Toutefois, les utilisateurs ont encore accès au code source pour ces bibliothèques. Et un document qui décrit les options MSBuild utilisées par Microsoft pour générer ces bibliothèques sera vraisemblablement publié dans un blog de l'équipe de Visual C++.

  • La prise en charge MFC pour IA64 a été supprimée. Toutefois, une prise en charge de CRT et ATL sur IA64 est encore disponible.

  • Les ordinaux ne sont plus réutilisés dans les fichiers de définition de module (.def) MFC. Cette modification signifie qu'il n'y aura pas de différence entre les ordinaux des versions mineures, et que la compatibilité binaire pour les Service Packs et les versions de correctif QFE sera améliorée.

  • Une nouvelle fonction virtuelle a été ajoutée à la classe CDocTemplate. Il s'agit de CDocTemplate::OpenDocumentFile. La version antérieure de OpenDocumentFile avait deux paramètres. La nouvelle version en a trois. Pour prendre en charge le Gestionnaire de redémarrage, toute classe dérivée de CDocTemplate doit implémenter la version dotée de trois paramètres. Pour plus d'informations sur la fonction, consultez CDocTemplate::OpenDocumentFile. Le nouveau paramètre est bAddToMRU.

Macros et variables d'environnement

  • La variable d'environnement __MSVCRT_HEAP_SELECT n'est plus prise en charge. Cette variable d'environnement est supprimée et rien ne la remplace.

Référence de Microsoft Macro Assembler

Voir aussi

Autres ressources

Mise en route de Visual C++ 2010