Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez C++ Discussion :

[FAQ][C++11] nullptr ou NULL


Sujet :

Contribuez C++

  1. #1
    Rédacteur/Modérateur

    [FAQ][C++11] nullptr ou NULL
    Je propose d'ajouter un article de ce style dans la FAQ (il faudrait en plus faire une passe globale pour supprimer tous les NULL):

    Faut-il utiliser 0, NULL ou nullptr pour désigner un pointeur NULL ?

    À partir de C++11, il faut utiliser nullptr. Avant, les avis divergent.
    • 0 est avant tout un entier. Il se trouve juste que, quand il est converti en pointeur, il retourne le pointeur nul,
    • NULL est une macro équivalente à 0, qui ajoute donc aux problèmes de 0 les problèmes d'être une macro (a-t-on inclus un header qui la définit ? Et si elle a été définie autrement ?), mais est peut-être un peu plus clair dans son intention,
    • nullptr est la valeur du pointeur nul, directement supportée par le langage depuis C++11.

    L'intérêt d'un support direct du langage se voit particulièrement en cas de surcharge :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f(char* pc) { cout << "Avec un pointeur" << endl;}
    void f(int i)    { cout << "Avec un entier" << endl; }
     
    f(0); // Entier
    f(NULL); // Entier aussi
    f(nullptr); // Pointeur


    Des développeurs ayant modifié la définition de NULL dans du code historique pour la rendre équivalente à nullptr ont reporté que cette manipulation, parmi moult faux positifs, a permis de mettre en évidence certains bugs, qui ne seraient jamais apparus si nullptr avait pu être utilisé dès le début.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #2
    Membre émérite
    À préciser : le type pointeur est en fait std::nullptr_t.

  3. #3
    Membre émérite
    Citation Envoyé par JolyLoic Voir le message
    (il faudrait en plus faire une passe globale pour supprimer tous les NULL)
    Je profite de ce thread pour dire que sur "tous" les exemples de la FAQ, peut-être trop simplistes, il n'y a aucune gestion des erreurs. Si passe il y a, il serait probablement utile d'y penser aussi...

  4. #4
    Expert confirmé
    Citation Envoyé par minnesota Voir le message
    Je profite de ce thread pour dire que sur "tous" les exemples de la FAQ, peut-être trop simplistes, il n'y a aucune gestion des erreurs. Si passe il y a, il serait probablement utile d'y penser aussi...
    Pas vraiment sûr que ce soit une bonne idée. Dans beaucoup de cas ça alourdi les exemples sans rien apporter de vraiment utile.

    Les exemples sont là pour montrer un point précis et aller à l'essentiel.

    (Et en poussant ça un peu plus loin, il faudrait fournir des tests unitaires pour les exemples )

  5. #5
    Rédacteur/Modérateur

    Citation Envoyé par oodini Voir le message
    À préciser : le type pointeur est en fait std::nullptr_t.
    Je pense que c'est une information intéressante, mais qui aurait plus sa place dans un autre point (quel est le type de nullptr ?). Il ne faut pas que la FAQ ressemble à une collection d'articles sur les différents points du langage, mais reste une FAQ : Des question précises, des réponses consises...

    Pour tout dire, je trouve déjà ma proposition d'article trop longue.
    Citation Envoyé par minnesota Voir le message
    Je profite de ce thread pour dire que sur "tous" les exemples de la FAQ, peut-être trop simplistes, il n'y a aucune gestion des erreurs. Si passe il y a, il serait probablement utile d'y penser aussi...
    Je suis du même avis qu'Iradille.
    Peut-être une question dessus dans la partie "meta" de la FAQ ? Genre : "Mais, vous ne gérez pas les erreurs dans vos exemples ?"
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre expert
    Bonjour,
    Je suis tout à fait d'accord, c'est une excellente idée .

    Pour ce qui est de la longueur, il vaut mieux une réponse de qualité qu'une réponse trop écourtée. La qualité viendra aussi des liens pertinents vers d'autres FAQ bien entendu.

  7. #7
    Expert éminent sénior
    Savoir quel est le type de nullptr n'apporte rien dans une FAQ. Un coup de google et on le trouve dans cppreference ou la norme, car on a déjà le mot clé (nullptr). Savoir comment choisir entre 0 et NULL et nullptr, ça ne vient pas immédiatement (quand on n'a pas le mot clé nullptr) et cela doit être, aujourd'hui, dans une FAQ. (j'étais opposé à toute réponse tranchée pour le C++03).

    Bref, je rejoins de l'avis de Loic: une FAQ doit répondre à des questions fréquemment posées si vous la voulez digeste.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...