Je vais commencer par ceci: la cohérence est roi, la décision est moins importante que la cohérence de votre base de code.
En C ++
NULL est défini comme 0 ou 0L en C ++.
Si vous avez lu le langage de programmation C ++ Bjarne Stroustrup suggère d'utiliser 0
explicitement pour éviter la NULL
macro lors de l'affectation , je ne sais pas s'il a fait la même chose avec les comparaisons, cela fait un moment que j'ai lu le livre, je pense qu'il vient de le faire if(some_ptr)
sans comparaison explicite mais je suis floue là-dessus.
La raison en est que la NULL
macro est trompeuse (comme presque toutes les macros le sont), elle est en fait 0
littérale, pas un type unique comme son nom l'indique. Éviter les macros est l'une des directives générales en C ++. D'autre part,0
ressemble à un entier et ce n'est pas le cas lorsqu'il est comparé ou attribué à des pointeurs. Personnellement, je pourrais aller dans les deux sens, mais généralement, je saute la comparaison explicite (bien que certaines personnes n'aiment pas cela, c'est probablement pourquoi vous avez un contributeur suggérant de toute façon un changement).
Indépendamment des sentiments personnels, c'est en grande partie un choix de moindre mal car il n'y a pas une seule bonne méthode.
C'est clair et un idiome courant et je le préfère, il n'y a aucune chance d'attribuer accidentellement une valeur lors de la comparaison et cela se lit clairement:
if(some_ptr){;}
C'est clair si vous savez qu'il some_ptr
s'agit d'un type de pointeur, mais cela peut aussi ressembler à une comparaison d'entiers:
if(some_ptr != 0){;}
C'est clair, dans les cas courants, cela a du sens ... Mais c'est une abstraction qui fuit, NULL
est en fait 0
littérale et pourrait finir par être facilement utilisée à mauvais escient:
if(some_ptr != NULL){;}
C ++ 0x a nullptr qui est maintenant la méthode préférée car elle est explicite et précise, faites juste attention à l'affectation accidentelle:
if(some_ptr != nullptr){;}
Jusqu'à ce que vous soyez en mesure de migrer vers C ++ 0x, je dirais que c'est une perte de temps à vous soucier de laquelle de ces méthodes vous utilisez, elles sont toutes insuffisantes, c'est pourquoi nullptr a été inventé (avec des problèmes de programmation génériques qui ont abouti à une transmission parfaite .) Le plus important est de maintenir la cohérence.
En C
C est une bête différente.
En C NULL peut être défini comme 0 ou comme ((void *) 0), C99 autorise l'implémentation de constantes de pointeur nul définies. Cela revient donc à la définition de NULL par l'implémentation et vous devrez l'inspecter dans votre bibliothèque standard.
Les macros sont très courantes et en général, elles sont beaucoup utilisées pour compenser les lacunes du support de programmation générique dans le langage et d'autres choses. Le langage est beaucoup plus simple et le recours au pré-processeur est plus courant.
De ce point de vue, je recommanderais probablement d'utiliser la NULL
définition de macro en C.