Подтвердить что ты не робот

Какой заголовок определяет NULL в С++?

В соответствии с С++ primer заголовок <cstdlib> определяет NULL. cpluspplus говорит, что он определен в <cstddef>.

В конечном счете, если правый заголовок не включен, я думал, что NULL нельзя ссылаться.

Из того, что я вижу, можно ссылаться и создавать программы и компилировать и запускать без предупреждений или ошибок, после включения только <iostream>

Пожалуйста, помогите мне понять это.

4b9b3361

Ответ 1

С++ 03 раздел 18.1.2 говорит, что NULL определяется в cstddef.

В некоторых реализациях iostream может включать cstddef, поэтому включение iostream также даст вам NULL.

Ответ 2

Стандарт C требует, чтобы NULL определялся в locale.h, stddef.h, stdio.h, stdlib.h, string.h, time.h и wchar.h.

Стандарт С++ требует, чтобы NULL определялся в заголовке c*, соответствующем каждому из них.

Стандарт C очень строг относительно имен, которые может определить стандарт - каждый стандартный заголовок должен точно определять имена, которые стандарт требует, чтобы заголовок определялся. Единственными другими именами, которые он может определить, являются те, которые зарезервированы для реализации, такие как те, которые начинаются с подчеркивания, за которым следует другой символ подчеркивания или заглавная буква.

В этом отношении стандарт С++ гораздо более разрешительный - в том числе любой стандартный заголовок может иметь тот же эффект, что и любой или все другие стандартные заголовки.

С практической точки зрения реализации С++, использующие для этого довольно много преимуществ, то есть в том числе один стандартный заголовок, часто определяемый именами из ряда других стандартных заголовков. Более поздние реализации, как правило, более похожи на стандарт C, которые находятся ближе к каждому заголовку, определяя только имена, требуемые для определения этим заголовком. Они все еще, вероятно, не так строги, как требует стандарт C, но гораздо ближе, чем раньше (как правило).

Ответ 3

Определяется в <cstddef>

В стандартном разделе 18.2 стандарта С++ 11 таблица 30 объясняет, что в <cstddef> В нем говорится:

Таблица 30 - Краткое описание <cstddef>

Макросы: NULL [...]

[...] Макрос NULL - это константа нулевого указателя С++, установленная в этом международном стандарте

Ответ 4

В стандарте С++ 11 указано, что NULL должно быть определено в нескольких файлах. Это:

<clocale>
<cstddef>
<cstdlib>
<cstring>
<ctime>
<cwchar>

Это упоминается в таблице 149, раздел C.3 C стандартной библиотеки /3 стандарта.

Здесь изображение таблицы и некоторый окружающий текст.

введите описание изображения здесь

Ответ 5

В последней версии MinGW (MinGW 5.3.0) NULL был определен в заголовке wchar.h как:

#define NULL 0