Пространства имён
Варианты
Действия

NULL

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <clocale>
Определено в заголовочном файле <cstddef>
Определено в заголовочном файле <cstdio>
Определено в заголовочном файле <cstdlib>
Определено в заголовочном файле <cstring>
Определено в заголовочном файле <ctime>
Определено в заголовочном файле <cwchar>
#define NULL /*определена реализацией*/

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

интегральным константным выражением rvalue целочисленного типа, которое оценивается как ноль

(до C++11)

целочисленным литералом с нулевым значением или prvalue типа std::nullptr_t

(начиная с C++11)

Константа нулевого указателя может быть неявно преобразована в любой указатель и указатель на тип элемента; такое преобразование приводит к нулевому значению указателя этого типа. Если константа нулевого указателя имеет целочисленный тип, она может быть преобразована в 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 разрешён только буквальный ноль

[править] Смотрите также

nullptr(C++11) литерал указателя, задающий нулевое значение указателя[править]
(C++11)
тип литерала нулевого указателя nullptr
(определение типа) [править]