Definido en el encabezado <clocale>
Definido en el encabezado <cstddef>
Definido en el encabezado <cstdio>
Definido en el encabezado <cstdlib>
Definido en el encabezado <cstring>
Definido en el encabezado <ctime>
Definido en el encabezado <cwchar>
#define NULL /*implementation-defined*/

La macro NULL es una constante de puntero nulo definida por la implementación, que puede ser.

una expresión constante integral rvalue de tipo entero que se evalúa como cero.

(hasta C ++ 11)

un literal entero con valor cero, o un valor pr de tipo std::nullptr_t.

(desde C ++ 11)

Una constante de puntero nulo se puede convertir implícitamente a cualquier tipo de puntero; tal conversión da como resultado el valor de puntero nulo de ese tipo. Si una constante de puntero nulo tiene un tipo entero, se puede convertir a un valor pr de tipo std::nullptr_t.

Posible implementación

#define NULL 0
//since C++11
#define NULL nullptr

Notas

En C, la macro NULL puede tener el tipo void*, pero eso no está permitido en C ++.

Ejemplo

#include <cstddef>
#include <type_traits>
#include <iostream>
class S;
int main()
{
    int* p = NULL;
    int* p2 = static_cast<std::nullptr_t>(NULL);
    void(*f)(int) = NULL;
    int S::*mp = NULL;
    void(S::*mfp)(int) = NULL;
 
    if (std::is_same_v<decltype(NULL), std::nullptr_t>) {
        std::cout << "NULL implemented with type std::nullptr_tn";
    } else {
        std::cout << "NULL implemented using an integral typen";
    }
}

Salida posible:

NULL implemented using an integral type

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C ++ publicados anteriormente.

DR Aplicado a Comportamiento según lo publicado Comportamiento correcto
CWG 903 C ++ 11 Se permitieron expresiones constantes con valor cero como 1-1. solo se permite el cero literal

Ver también

nullptr el literal de puntero que especifica un valor de puntero nulo (C ++ 11)
nullptr_t
(C ++ 11)
el tipo del literal de puntero nulo nullptr
(typedef)