◐ Shell
clean mode source ↗

NULL — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <clocale>

Определено в заголовочном файле <cstddef>

Определено в заголовочном файле <cstdio>

Определено в заголовочном файле <cstdlib>

Определено в заголовочном файле <cstring>

Определено в заголовочном файле <ctime>

Определено в заголовочном файле <cwchar>

#define NULL /*определена реализацией*/

Макрос NULL является определяемой реализацией константой нулевого указателя, которая может быть

Константа нулевого указателя может быть неявно преобразована в любой указатель и указатель на тип элемента; такое преобразование приводит к нулевому значению указателя этого типа. Если константа нулевого указателя имеет целочисленный тип, она может быть преобразована в prvalue типа std::nullptr_t.

Возможная реализация

#define NULL 0
//начиная с C++11
#define NULL nullptr

Примечание

В C макрос NULL может иметь тип void*, но это не разрешено в C++.

Некоторые реализации определяют NULL как расширение компилятора __null со следующими свойствами:

  • __null эквивалентен целочисленному литералу с нулевым значением (и, следовательно, совместим со стандартом C++) и имеет тот же размер, что и void*, например он эквивалентен 0/0L на платформах no section name соответственно;
  • преобразование из __null в арифметический тип, включая сам тип __null, может вызвать предупреждение.

Пример

#include <cstddef>
#include <type_traits>
#include <iostream>
#include <typeinfo>
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;
    auto nullvar = NULL; // может быть вызвано предупреждение при компиляции
                         // с помощью gcc/clang

    std::cout << "Тип `nullvar` равен " << typeid(nullvar).name() << '\n';

    if constexpr(std::is_same_v<decltype(NULL), std::nullptr_t>) {
        std::cout << "NULL реализован типом std::nullptr_t\n";
    } else {
        std::cout << "NULL реализован целочисленным типом\n";
    }

    [](...){}(p, p2, f, mp, mfp); //< подавляет предупреждения о
                                  // "неиспользуемой переменной"
}

Возможный вывод:

Тип `nullvar` равен long
NULL реализован целочисленным типом

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
CWG 903 C++11 разрешены константные выражения с нулевым значением, такие как 1-1 разрешён только буквальный ноль

Смотрите также