web-dev-qa-db-fra.com

Vous utilisez NULL en C ++?

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?

33
Jookia

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é.

34
Tarantula

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.

13
user180326

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.

3
Konrad

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.

1
T.E.D.

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.

1
Mark B