none
Pourquoi mon code compile sous Visual Studio 2003 et pas sous Visual Studio 2010 ? RRS feed

  • Question

  • Bonjour,

    Pourquoi le code suivant ne compile-t-il pas avec Visual C++ 2010, alors qu’il compile avec Visual C++ 2003 et 2005 ?

    std::vector<void *> v;

    v.insert(v.begin(), 0);

    L’erreur est la suivante :

    error C2440: ‘initializing’: cannot convert from ‘int’ to ‘void *’

    Normalement, la valeur 0 devrait toujours pouvoir être convertie en pointeur. D’ailleurs, la ligne suivante compile avec succès avec Visual 2010 :

    void *p = 0;

    Pour contourner le problème, on peut faire par exemple :

    v.insert(v.begin(), static_cast<void *>(0));

    Mais le problème est que cette erreur se produit à plusieurs endroits dans un programme qui fait quelques milliers de lignes, et que le compilateur n’indique pas l’endroit du code à modifier : il indique toujours l’erreur dans le fichier xmemory (ligne 208). Il est donc très fastidieux de retrouver les endroits du code à corriger. (Mon but est de rendre compilable par Visual Studio 2010 un programme initialement développé sous Visual Studio 2003).

    Chris

    mercredi 19 mai 2010 20:51

Réponses

Toutes les réponses

  • Bonjour,

    Normalement, pour être le plus rigoureux possible (et éviter des erreurs de compilation lors des changements de versions), vous devriez corriger tout votre code comme ceci :

    v.insert(v.begin(), (void*)0);

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    jeudi 20 mai 2010 07:17
    Modérateur
  • Bonjour Gilles,

    Merci pour votre réponse.

    En fait, la question que je me posais, ce n’était pas tellement de savoir comment corriger l’erreur de compilation (car j’avais déjà trouvé une solution), mais plutôt de comprendre quelle est la cause de l’erreur.

    Vous dites qu’il est plus rigoureux de caster 0 en void *, mais je ne suis pas tout à fait d’accord, je ne vois pas en quoi c’est plus rigoureux.

    Si le standard C++ dit que la valeur 0 doit toujours pouvoir être implicitement convertie en pointeur (et il me semble que c’est le cas), alors mon code devrait compiler avec tout compilateur C++ conforme au standard C++. Si mon code ne compile pas alors qu’il est conforme au standard, le problème ne vient pas du code, mais du compilateur (ou peut-être plutôt dans mon cas, de la manière dont la classe std::vector est implémentée dans la bibliothèque fournie avec le compilateur).

    Si par contre mon code n’était pas conforme au C++ standard, il ne devrait pas compiler sous Visual studio 2003 et 2005 avec l’option /Za (cette option désactive les "extensions de langages Microsoft", c’est-à-dire qu’avec cette option, seul le code conforme au C++ standard devrait compiler). Or mon code compile avec succès sous Visual studio 2003 et 2005 avec l’option /Za. Ce qui voudrait donc dire que l’option /Za ne fonctionne pas correctement sous Visual Studio 2003 et 2005.

    Par ailleurs, je n’utilise jamais en C++ les casts de type C (par exemple (void *)0),  mais toujours les cast de type C++ (static_cast, dynamic_cast, const_cast et reinterpret_cast), et ce pour 2 raisons :

    1- Les casts de type C++ sont plus rigoureux : Ils diminuent le risque de bug en faisant apparaître lors de la compilation des erreurs qui seraient passées inaperçues avec des casts de type C.

    2- Si on veut rechercher tous les casts dans du code avec la fonction "Rechercher" d’un IDE, avec les casts de type C, c’est difficile car si on fait une recherche sur "(" ou ")", on va en trouver beaucoup qui ne correspondent pas à des casts. Alors qu’avec les casts de type C++, il me suffit de faire une recherche sur "cast".

    C’est pourquoi j’avais mis dans mon précédent message static_cast<void *>(0) plutôt que (void *)0.

    Cordialement,

    Chris

     

    jeudi 20 mai 2010 13:27
  • Bonjour,

     

    Ce problème a été déjà analysé et une réponse est venue de la part des développeurs :

    https://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair?wa=wsignin1.0#tabs

     

     

    Cordialement,

    Alex

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework

     

     

    • Marqué comme réponse Alex Petrescu mercredi 26 mai 2010 08:49
    mardi 25 mai 2010 08:19