207 votes

Utilisez-vous NULL ou 0 (zéro) pour les pointeurs en C ++?

Dans les premiers jours de C++ quand il a été vissé sur le dessus de C, vous ne pourriez pas utiliser la valeur NULL comme il a été défini comme (void*)0. Vous ne pourriez pas affecter la valeur NULL à un pointeur autre que void*, ce qui fait inutile. Retour en ces jours, il a été accepté que vous avez utilisé 0 (zéro) pour les pointeurs null.

À ce jour, j'ai continué à utiliser le zéro comme un pointeur null mais ceux autour de moi d'insister sur l'utilisation de l' NULL. Personnellement, je ne vois aucun avantage à donner un nom (NULL) à une valeur existante - et depuis j'ai aussi envie de tester les pointeurs en tant que valeurs de vérité:

if (p && !q)
  do_something();

ensuite, à l'aide de zero a plus de sens (comme si vous utilisez NULL, vous ne pouvez pas logiquement utiliser p && !q - , vous devez explicitement comparer NULL, à moins que vous assumez NULL est égal à zéro, dans ce cas pourquoi utiliser NULL).

Est-il une raison objective à préférer zéro sur NULL (ou vice versa), ou est tout simplement de préférence personnelle?

Edit: je devrais ajouter (et signifiait à l'origine de dire) qu'avec RAII et des exceptions, j'utilise rarement zéro/pointeurs NULL, mais parfois vous avez besoin d'eux encore.

202voto

Martin Cote Points 12762

Voici de Stroustrup prendre sur ce: C++ Style et de la Technique FAQ

En C++, la définition de l' NULL 0, donc il y a seulement une différence esthétique. Je préfère éviter les macros, j'ai donc utiliser 0. Un autre problème avec NULL est que parfois les gens croient à tort qu'il est différent de 0 et/ou non un entier. Dans le pré-code standard, NULL a été/est parfois définie à quelque chose d'impropre et donc a/a à éviter. C'est moins fréquent de nos jours.

Si vous devez citer le pointeur null, appellent nullptr; c'est ce qu'on appelle en C++11. Ensuite, nullptr va être un mot-clé.

Cela dit, ne pas transpirer les petites choses.

127voto

Richard Corden Points 12292

Il y a quelques arguments (dont l'un est relativement récente) qui, je crois, de contredire Bjarne sa position sur cette.

1) la Documentation d'intention:

L'utilisation de 'NULL' permet de faire des recherches sur son utilisation, et il souligne aussi que le développeur "voulu" utiliser un pointeur NULL, indépendamment du fait qu'il est interprété par le compilateur comme NULLE ou non.

2) la Surcharge de pointeur et " int " est relativement rare

L'exemple que tout le monde cite:

void foo(int*);
void foo (int);

void bar() {
  foo (NULL);  // Calls 'foo(int)'
}

Cependant, au moins à mon avis, le problème ci-dessus n'est pas que nous sommes à l'aide de la valeur NULL pour le pointeur null constante, c'est que nous avons surcharges de " foo " qui prennent très différents types d'arguments. Le paramètre doit être un int trop, comme toute autre type de conséquence dans l'ambiguïté d'un appel et ainsi de générer un utile avertissement du compilateur.

3) outils d'Analyse peut aider à aujourd'HUI!

Même en l'absence de C++ 0x, il existe des outils disponibles aujourd'hui qui permet de vérifier que la valeur NULL est utilisé pour les pointeurs, et que 0 est utilisé pour les types intégraux.

4) C++ 11 aura un nouveau 'std::nullptr_t' type.

C'est le nouvel argument à la table. Le problème de l'0 et NULL sont abordés activement pour C++ 0x, et vous pouvez garantir que chaque mise en œuvre qui fournit la valeur NULL, la première chose qu'ils vont faire c'est:

#define NULL  nullptr

Pour ceux qui utilisent une valeur NULL au lieu de 0, le changement est une amélioration de la sécurité du type avec peu ou pas d'effort - si quelque chose, il peut aussi attraper quelques bugs où ils ont utilisé la valeur NULL par 0. Pour toute personne utilisant '0' aujourd'hui....hum...eh bien, j'espère qu'ils ont une bonne connaissance des expressions régulières...

49voto

Andy Lester Points 34051

Utilisez NULL. NULL montre votre intention. Que ce soit 0 est un détail d'implémentation qui ne devrait pas avoir d'importance.

47voto

Andrew Stein Points 6344

J'utilise toujours:

 NULL for pointers
'\0' for chars
0.0 for floats and doubles
 

où 0 irait bien. C'est une question d'intention de signalisation. Cela dit, je ne suis pas anal à ce sujet.

34voto

Ferruccio Points 51508

J'ai cessé d'utiliser la valeur NULL en faveur de 0 il y a longtemps (comme la plupart des autres macros). Je n'ai pas seulement parce que je voulais éviter les macros autant que possible, mais aussi parce que NUL ne semble s'être utilisé dans le code C et C++. Il semble être utilisé chaque fois qu'une valeur de 0 est nécessaire, pas seulement pour les pointeurs.

Sur de nouveaux projets, j'ai mis ça dans un projet d'en-tête:

static const int nullptr = 0;

Maintenant, quand C++0x conforme compilateurs arriver, tout ce que j'ai à faire est de supprimer cette ligne. Un bel avantage de ceci est que Visual Studio est déjà reconnaît nullptr comme un mot-clé et il met en évidence de façon appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X