J'ai vu ci-dessous macro dans le fichier d'en-tête le plus élevé:
Vous ne devriez pas avoir vu que, la bibliothèque standard définit en <cstddef>
(et <stddef.h>
). Et, IIRC, selon la norme, la redéfinition des noms définis par les fichiers d'en-tête standard entraîne un comportement indéfini. Donc, d'un point de vue purement normatif, vous ne devriez pas faire cela.
J'ai vu des gens faire ce qui suit, pour une raison quelconque leur esprit brisé la pensée de:
struct X{
virtual void f() = NULL;
}
(Comme dans [mal]: "mettre le pointeur de table virtuelle NULL
")
Ceci n'est valide que si NULL
est défini comme 0
, car = 0
est le jeton valide pour les fonctions purement virtuelles (§9.2 [class.mem]
).
Cela dit, si NULL
était correctement utilisé comme un pointeur NULL constante, alors rien ne devrait se briser.
Cependant, méfiez-vous que, même si apparemment utilisé correctement, cela va changer:
void f(int){}
void f(char*){}
f(0); // calls f(int)
f(nullptr); // calls f(char*)
Cependant, si cela soit le cas, il a été presque certainement cassé de toute façon.
'Vous ne devriez pas avoir vu ça'. Pourquoi tu te sens si bien? J'ai même vu une macro étrange, '#define NULL (void *) (0)' dans un code de production pour DSP pour WCDMA L1. – iammilind
Est-ce que 'virtual void f() = 0L;' légal? Parce que '#define NULL 0L' est certainement une implémentation conforme. –
@iammilind: Vous ne devriez pas, car 'NULL' est déjà défini par le standard. – Xeo