Widziałem poniżej makro w najwyższej pliku nagłówka:
Nie powinieneś zauważyć, że średnia biblioteka definiuje ją w <cstddef>
(i <stddef.h>
). I, IIRC, zgodnie ze standardem, redefiniowanie nazw zdefiniowanych przez standardowe pliki nagłówkowe powoduje niezdefiniowane zachowanie. Więc z czysto standardowego punktu widzenia nie powinieneś tego robić.
Widziałem ludzi, wykonaj następujące czynności, niezależnie od przyczyny ich zepsuty umysł myśl:
struct X{
virtual void f() = NULL;
}
(jak w [nieprawidłowo]: "ustawić kursor wirtualny stół do NULL
")
jest ważny tylko jeśli NULL
jest zdefiniowana jako 0
, ponieważ = 0
jest ważne token funkcji czystej wirtualnego (§9.2 [class.mem]
).
Powiedział, jeśli NULL
był poprawnie stosowany jako null pointer stałą, wtedy nic nie należy łamać.
Jednak uwaga, że nawet jeśli pozornie są stosowane prawidłowo, to się zmieni:
void f(int){}
void f(char*){}
f(0); // calls f(int)
f(nullptr); // calls f(char*)
Jednak jeśli kiedykolwiek był przypadek, to było prawie na pewno uszkodzony zapas.
"Nie powinieneś tego widzieć". Dlaczego tak się czujesz? Widziałem nawet dziwne makro, takie jak '#define NULL (void *) (0)' w kodzie produkcyjnym dla DSP dla WCDMA L1. – iammilind
Czy 'virtual void f() = 0L;' legal? Ponieważ '#define NULL 0L' z pewnością jest zgodną implementacją. –
@iammilind: Nie powinieneś, ponieważ 'NULL' jest już zdefiniowany przez standard. – Xeo