NULL
| Определено в заголовочном файле <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 (определение типа) |
Документация C по NULL
| |