que he visto debajo de macro en el archivo de cabecera superior:
No deberías haber visto que, la biblioteca estándar define en <cstddef>
(y <stddef.h>
). Y, IIRC, según el estándar, la redefinición de los nombres definidos por los archivos de encabezado estándar da como resultado un comportamiento indefinido. Entonces, desde un punto de vista puramente estándar, no deberías hacer eso.
gente que he visto hacer lo siguiente, por cualquier razón su mente roto pensamiento de:
struct X{
virtual void f() = NULL;
}
(como en [mal]: "establecer el puntero de la tabla virtual para NULL
")
Esto solo es válido si NULL
se define como 0
, porque = 0
es el token válido para funciones puramente virtuales (§9.2 [class.mem]
).
Dicho esto, si NULL
fue correctamente utilizarse como una constante puntero nulo, entonces nada debe romper.
Sin embargo, ten en cuenta que, aunque aparentemente se utiliza correctamente, esto va a cambiar:
void f(int){}
void f(char*){}
f(0); // calls f(int)
f(nullptr); // calls f(char*)
Sin embargo, si ese era siempre el caso, es casi seguro que fue roto de todos modos.
'No deberías haber visto eso'. ¿Por qué te sientes así? Incluso he visto una macro extraña como, '#define NULL (void *) (0)' en un código de producción para DSP para WCDMA L1. – iammilind
Es 'virtual void f() = 0L;' legal? Porque '#define NULL 0L' ciertamente es una implementación conforme. –
@iammilind: No deberías, porque 'NULL' ya está definido por el estándar. – Xeo