Duplicata possible:
tilisez-vous NULL ou 0 (zéro) pour les pointeurs en C++?
Est-ce une bonne idée d'utiliser NULL en C++ ou simplement la valeur 0?
Existe-t-il une circonstance particulière utilisant NULL dans le code C appelant depuis C++? Comme SDL?
En C++, NULL se développe en 0 ou 0L. Voir ce commentaire de Stroustrup :
Dois-je utiliser NULL ou 0? En C++, la définition de NULL est 0, il n'y a donc qu'une différence esthétique. Je préfère éviter les macros, donc j'utilise 0. Un autre problème avec NULL est que les gens croient parfois à tort qu'il est différent de 0 et/ou non d'un entier. Dans le code pré-standard, NULL était/est parfois défini sur quelque chose d'inadapté et devait/doit donc être évité. C'est moins courant de nos jours.
Si vous devez nommer le pointeur nul, appelez-le nullptr; c'est comme ça que ça va s'appeler en C++ 0x. Ensuite, "nullptr" sera un mot-clé.
L'inconvénient de NULL en C++ est qu'il s'agit d'un définir pour 0. Il s'agit d'une valeur qui peut être convertie silencieusement en pointeur, une valeur booléenne, un flottant/double ou un int.
Ce n'est pas très sûr et a conduit à de réels bugs dans une application sur laquelle j'ai travaillé.
Considère ceci:
void Foo(int i);
void Foo(Bar* b);
void Foo(bool b);
main()
{
Foo(0);
Foo(NULL); // same as Foo(0)
}
C++ 11 définit un nullptr
qui est convertible en un pointeur nul mais pas en d'autres scalaires. Ceci est pris en charge dans tous les compilateurs C++ modernes, y compris VC++ à partir de 2008. Dans les anciennes versions de GCC, il existe une fonctionnalité similaire, mais elle s'appelait alors __null
.
De crtdbg.h (et de nombreux autres en-têtes):
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
Par conséquent, NULL
est 0
, au moins sur la plate-forme Windows. Donc non, pas que je sache.
Je n'utilise jamais NULL dans mon code C ou C++. 0
Fonctionne très bien, tout comme if (ptrname)
. Tout programmeur C ou C++ compétent devrait savoir ce que cela fait.
En supposant que vous n'avez pas d'en-tête de bibliothèque ou de système qui définit NULL
comme par exemple (void*)0
ou (char*)0
c'est bien. J'ai toujours tendance à utiliser 0 moi-même car c'est par définition le pointeur nul. En c ++ 0x, vous aurez nullptr
disponible donc la question n'aura plus autant d'importance.