Partager via


Modifications avec rupture dans le compilateur Visual C++ 2005

Mise à jour : novembre 2007

Cette rubrique traite des changements de comportement dans Visual C++ 2005 susceptibles de provoquer des problèmes de compilation ou de comportement différent au moment de l'exécution d'un code qui fonctionnait dans une version antérieure.

Pour plus d'informations sur les nouvelles fonctionnalités, consultez Modifications apportées à Visual C++ 2005 et aux éditions antérieures, Modifications apportées aux bibliothèques Visual C++ 2005 et Nouveautés du compilateur, du langage et des outils dans Visual C++ 2005.

  • Les pointeurs de membres nécessitent désormais un nom qualifié et &
    Le code écrit pour les versions antérieures du compilateur qui vient d'utiliser le nom de méthode générera désormais Erreur du compilateur C3867 ou Avertissement du compilateur C4867. Ce diagnostic est requis par Standard C++. À présent, pour créer un pointeur de fonction membre, l'adresse d'opérateur (&) doit être utilisée avec le nom qualifié complet de la méthode. Ne pas utiliser l'opérateur & et le nom qualifié complet de la méthode peut provoquer des bogues logiques dans le code en raison de parenthèses manquantes dans les appels de fonction. L'utilisation du nom de la fonction sans liste d'arguments produit un pointeur de fonction convertible en plusieurs types. Ce code se serait compilé, entraînant un comportement inattendu au moment de l'exécution.

  • La classe doit être accessible à une déclaration friend.
    Les compilateurs Visual C++ antérieurs à Visual C++ 2005 autorisaient une déclaration friend pour une classe qui n'était pas accessible dans la portée de la classe contenant la déclaration. Désormais, le compilateur générera Erreur du compilateur C2248. Pour résoudre cette erreur, modifiez l'accessibilité de la classe qui est spécifiée dans la déclaration friend. Cette modification a été apportée pour se conformer à la norme C++.

  • __int asm 3 se compile désormais en code natif
    Lors de sa compilation avec /clr, __asm int 3 n'a pas provoqué la génération de code natif ; le compilateur a traduit l'instruction en une instruction d'arrêt CLR. Dans Visual C++ 2005, __asm int 3 provoque désormais la génération de code natif pour la fonction. Si vous souhaitez qu'une fonction provoque un point d'arrêt dans votre code et si vous souhaitez que cette fonction soit compilée en MSIL, utilisez __debugbreak. Pour plus d'informations, consultez __asm et /clr (Compilation pour le Common Language Runtime). Cette modification a été apportée pour être plus déterministe sur le moment de générer du code natif par rapport à du code managé ; le code assembleur inline doit générer du code natif.

  • La spécialisation explicite n'est pas autorisée comme un constructeur de copie ou un opérateur d'assignation de copie.
    Le code qui dépend d'une spécialisation explicite de modèle pour un constructeur de copie ou un opérateur d'assignation de copie obtiendra désormais Erreur du compilateur C2299. La norme C++ l'interdit. Cette modification a été apportée pour des raisons de conformité, afin d'améliorer la portabilité du code.

  • Un modèle de classe non spécialisé ne peut pas être utilisé comme argument template dans une liste de classes de base.
    L'utilisation d'un nom de classe de modèle non spécialisé dans la liste de classes de base pour une définition de classe générera Erreur du compilateur C3203. L'utilisation d'un nom de classe de modèle non spécialisé comme paramètre de modèle dans une liste de classes de base est illégale. Ajoutez les paramètres de type de modèle de façon explicite au nom de classe de modèle lors de son utilisation comme paramètre de modèle dans une liste de classes de base. Cette modification a été apportée pour des raisons de conformité, afin d'améliorer la portabilité du code.

  • Déclaration using de type imbriqué qui n'est plus autorisée
    Le code qui contient une déclaration using vers un type imbriqué générera désormais Erreur du compilateur C2885. Pour résoudre cette erreur, vous devez qualifier entièrement des références aux types imbriqués, placer le type dans un espace de noms ou créer un typedef. Cette modification a été apportée pour des raisons de conformité, afin d'améliorer la portabilité du code.

  • Le compilateur n'autorise pas const_cast à effectuer un downcast sous /clr:oldSyntax
    Avant Visual C++ 2005 le compilateur Visual C++ autorisait le const_cast Operator à effectuer un downcast lors de la compilation de code source qui utilise la syntaxe des extensions managées pour C++. L'exécution d'un downcast avec const_cast provoque désormais Erreur du compilateur C2440. Pour résoudre cette erreur, utilisez le bon opérateur de cast (pour plus d'informations, consultez Casting Operators). Cette modification a été apportée pour des raisons de conformité.

  • Le compilateur rejette la déclaration anticipée d'un enum managé
    Avant Visual C++ 2005 le compilateur Visual C++ autorisait les déclarations anticipées d'enums managés. Désormais, la déclaration d'un enum managé sans le définir lors de sa compilation avec toute forme de /clr provoquera Erreur du compilateur C2599. Pour résoudre cette erreur, définissez toujours des enums managés lors de la déclaration. Cette modification a été apportée car le bon fonctionnement des déclarations anticipées d'enums managés n'a pas toujours été garanti : le compilateur ne peut pas identifier correctement le type sous-jacent de l'enum. De même, la norme C++ n'autorise pas les déclarations d'enum.

  • L'option du compilateur /YX est supprimée
    /YX a généré une prise en charge automatique d'en-têtes précompilés. Elle a été utilisée par défaut dans l'environnement de développement. Si vous supprimez /YX de vos configurations de génération et que vous ne le remplacez pas, les générations peuvent devenir plus rapides. En plus d'éventuels comportements inattendus avec /YX, il est préférable d'utiliser /Yc (Créer un fichier d'en-tête précompilé) et /Yu (Utiliser un fichier d'en-tête précompilé), qui vous donnent plus de contrôle sur l'utilisation des en-têtes précompilés.

  • Les options du compilateur /Oa et /Ow sont supprimées
    Les options du compilateur /Ow et /Oa ont été supprimées mais seront silencieusement ignorées. Utilisez les modificateurs noalias, restrict ou __declspec pour spécifier la façon dont le compilateur effectue le crénelage.

  • L'option du compilateur /Op est supprimée
    L'option /Op du compilateur a été supprimée. Utilisez /fp (Spécifier le comportement de virgule flottante) à la place.

  • Les options du compilateur /ML et /MLd ont été supprimées
    Visual C++ ne prend plus en charge la bibliothèque CRT monothread liée statiquement. Utilisez /MT et /MTd à la place. Consultez C Run-Time Libraries pour plus d'informations.

  • Les options du compilateur /G3, /G4, /G5, /G6, /G7 et /GB ont été supprimées
    Le compilateur utilise désormais un modèle fusionné qui tente de créer le meilleur fichier de sortie pour toutes les architectures.

  • /Gf a été supprimé
    Utilisez /GF (Supprimer les doublons) à la place. /GF place les chaînes regroupées dans une section en lecture seule, plus sûre que la section accessible en écriture où /Gf les a ajoutées.

  • /clr n'est pas compatible avec /MT.
    Il n'existe pas de prise en charge dans la Bibliothèque Runtime C pour lier statiquement à une application managée. Toutes les applications managées doivent être liées dynamiquement (/MD). Pour plus d'informations sur les restrictions de l'utilisation de /clr, consultez Restrictions de /clr.

  • /GS est désormais activé par défaut
    Le contrôle du dépassement de capacité de la mémoire tampon est maintenant activé par défaut. Vous pouvez désactiver le contrôle du dépassement de mémoire tampon avec /GS-. Pour plus d'informations, consultez /GS (Vérification de la sécurité de la mémoire tampon).

  • /Zc:wchar_t est désormais activé par défaut
    Il s'agit d'un comportement de la norme C++ ; par défaut, le type intégré sera affecté à une variable wchar_t au lieu d'un entier non signé court. Cette modification interrompt la compatibilité binaire lorsque le code client est lié aux bibliothèques qui ont été compilées sans /Zc:wchar_t (LNK2019). Dans ce cas, vous pouvez utiliser /Zc:wchar_t- pour rétablir l'ancien comportement non standard. Cette modification a été introduite pour créer un code conforme par défaut.

    Pour plus d'informations, consultez /Zc:wchar_t (wchar_t est un type natif).

  • /Zc:forScope est désormais activé par défaut
    Il s'agit d'un comportement de la norme C++ ; le code qui dépend de l'utilisation d'une variable déclarée dans une boucle for après la fin de la portée de la boucle for ne pourra plus désormais être compilé. Utilisez /Zc:forScope- pour rétablir l'ancien comportement non standard. Cette modification a été introduite pour créer un code conforme par défaut.

    Pour plus d'informations, consultez /Zc:forScope (Forcer la conformité à la portée de la boucle for).

  • Application de la vérification des paramètres pour les attributs Visual C++
    Le code qui passe des attributs nommés au constructeur d'attribut entre guillemets lorsque le type n'est pas une chaîne et sans guillemets lorsque le type est une chaîne générera désormais Erreur du compilateur C2065 ou Avertissement du compilateur (niveau 1) C4581. Auparavant, tous les attributs de compilateur étaient analysés comme chaînes et, si nécessaire, le compilateur insérait les guillemets manquants. La prise en charge des attributs a été améliorée par l'ajout de la validation de la vérification des paramètres. Cela empêchera un comportement inattendu dû à des arguments incorrects passés à un constructeur d'attribut.

    Pour cette version, vous ne pouvez pas avoir de chaîne de caractères à plusieurs octets (MBCS) dans tout argument à un attribut qui prend une chaîne implicite en tant qu'argument, même si la chaîne est entre guillemets (cela peut produire un fichier .idl corrompu). La solution est la suivante :

    #define ARG string_with_MBCS_chars
    [helpstring(ARG)]
    
  • Le compilateur exige désormais la même spécification de modèle pour plusieurs déclarations du même type.
    Si vous avez une déclaration anticipée d'un type de sorte que vous puissiez créer des fonctions friend à ce type, par exemple, la spécification de modèle du type doit être la même sur toutes les déclarations pour le type. Sinon, le compilateur émettra Erreur du compilateur C2990.

  • l'attribut uuid ne peut plus cibler des types managés
    L'attribut uuid (C++ Attributes) était autorisé sur un attribut défini par l'utilisateur à l'aide des extensions managées pour C++, mais générera désormais Erreur du compilateur C3451. Utilisez GuidAttribute à la place.

  • Modification de syntaxe pour passer des tableaux managés aux attributs personnalisés
    Le type du tableau n'est plus déduit dans la liste d'initialisation d'agrégats. Le compilateur exige désormais que vous spécifiiez le type du tableau ainsi que la liste d'initialiseurs. L'ancienne syntaxe provoquera désormais Erreur du compilateur C3104. Cette modification était nécessaire car le compilateur ne pouvait pas toujours déduire correctement le type de tableau de la liste d'initialisation d'agrégats.

  • Le compilateur n'injectera pas int comme type par défaut dans les déclarations.
    Le code dont le type est manquant dans une déclaration ne prendra plus par défaut le type int que le compilateur générera Avertissement du compilateur C4430 ou Avertissement du compilateur (niveau 4) C4431. C++ standard ne prend pas en charge un int par défaut et cette modification vous garantit d'obtenir le type que vous souhaitez vraiment.

  • dynamic_cast a amélioré la conformité à la norme C++.
    La bibliothèque Runtime C effectue désormais une vérification de dynamic_cast à l'exécution pour garantir que le type au moment de la compilation de l'expression sur laquelle un cast est effectué fait référence à un sous-objet de classe de base public du type cible cast (pour un downcast) ou du type d'objet le plus dérivé (pour un cast croisé). Pour plus d'informations, consultez Modifications avec rupture dans dynamic_cast.

  • Une rvalue ne peut pas être liée à une référence non const.
    Une rvalue ne peut pas être liée à une référence non const. Dans les versions antérieures de Visual C++, il était possible de lier une rvalue à une référence non const dans une initialisation directe. Ce code génère désormais Avertissement du compilateur (niveau 1) C4350.

  • Les types valeur n'émettent plus de constructeur par défaut ; cela peut provoquer l'exécution d'initialiseurs de type à des points différents
    Avant Visual C++ 2005 les constructeurs statiques (initialiseurs de type) dans les types valeur étaient exécutés lorsqu'une instance du type valeur était créée. Pour s'assurer que ces constructeurs statiques sont exécutés, accédez à des données membre static ou (/clr:oldSyntax uniquement) définissez un constructeur d'instance. Aucun constructeur par défaut n'était fourni aux types valeur car le Common Language Runtime ne garantit pas qu'il appellera toujours un constructeur par défaut. De même, ne pas fournir de constructeur par défaut aux types valeur permet d'améliorer les performances.

  • Les types valeur boxed sont désormais lus uniquement dans les contextes vérifiables (/clr:safe).
    Le Common Language Runtime n'autorise plus la modification d'un type valeur boxed lors de la compilation d'un assembly vérifiable. Le compilateur génère désormais Avertissement du compilateur C4972 lorsqu'il détecte cela.

    C4792 est généré uniquement si vous modifiez la valeur de l'objet de valeur sous-jacent via un objet de valeur boxed. L'erreur ne se produira pas si vous modifiez une copie de l'objet de valeur (par exemple, modification d'un objet boxed)

  • Les types natifs sont, par défaut, privés à l'extérieur de l'assembly
    Par défaut, les types natifs ne seront désormais pas visibles à l'extérieur de l'assembly. Pour plus d'informations sur la visibilité du type à l'extérieur de l'assembly, consultez Type Visibility. Cette modification a été motivée par les besoins des développeurs utilisant d'autres langages, non sensibles à la casse, lors du référencement des métadonnées créées dans Visual C++.

  • /clr accepte désormais la nouvelle syntaxe CLR pour Visual C++
    Avant Visual C++ 2005, /clr compilait la syntaxe des extensions managées pour C++. /clr compile désormais la nouvelle syntaxe CLR et /clr:oldSyntax compile la syntaxe des extensions managées pour C++. Pour plus d'informations sur /clr, consultez /clr (Compilation pour le Common Language Runtime). Pour plus d'informations sur la nouvelle syntaxe, consultez Language Features for Targeting the CLR.

  • /clr ne compile plus les fichiers de code source C
    Avant Visual C++ 2005, vous pouviez compiler les fichiers de code source C avec /clr ; toutefois, cela provoquera désormais Erreur de ligne de commande D8045. Pour résoudre cette erreur, modifiez l'extension de fichier en .cpp ou .cxx ou compilez avec /TP ou /Tp. Pour plus d'informations, consultez /Tc, /Tp, /TC, /TP (Spécifier le type de fichier source).

  • Modifications MSIL lors du test de l'égalité
    Pour plus d'informations, consultez Comment : tester l'égalité.

Voir aussi

Référence

Modifications avec rupture dans le compilateur Visual C++