web-dev-qa-db-fra.com

Quel en-tête définit NULL en C ++?

Selon amorce C++ , <cstdlib> l'en-tête définit NULL. cpluspplus indique qu'il est défini dans <cstddef>.

En fin de compte, si l'en-tête de droite n'est pas inclus, je pensais que NULL ne pouvait pas être référencé.

D'après ce que je peux voir, cependant, il peut être référencé et produire des programmes qui se compilent et s'exécutent sans avertissements ni erreurs, après avoir inclus uniquement <iostream>

Veuillez m'aider à comprendre cela.

38
James Leonard

La section 18.1.2 de C++ 03 indique que NULL est défini dans cstddef.

Sur certaines implémentations, iostream peut inclure cstddef, donc inclure iostream vous donnera également NULL.

25
Vaughn Cato

La norme C requiert que NULL soit défini dans locale.h, stddef.h, stdio.h, stdlib.h, string.h, time.h, et wchar.h.

La norme C++ requiert que NULL soit défini dans le c* en-tête correspondant à chacun d'eux.

La norme C est très stricte quant aux noms qu'une norme peut définir - chaque en-tête standard doit définir précisément les noms que la norme requiert que cet en-tête définisse. Les seuls autres noms qu'il peut définir sont ceux qui sont réservés à l'implémentation, tels que ceux commençant par un trait de soulignement suivi d'un autre trait de soulignement ou d'une majuscule.

La norme C++ est beaucoup plus permissive à cet égard - l'inclusion d'un en-tête standard peut avoir le même effet que l'inclusion de tout ou partie d'autres en-têtes standard.

D'un point de vue pratique, les implémentations C++ profitaient un peu de cette permissivité, c'est-à-dire que l'inclusion d'un en-tête standard définissait fréquemment les noms d'un certain nombre d'autres en-têtes standard. Les implémentations plus récentes ont tendance à fonctionner plus comme l'exige la norme C, en restant beaucoup plus proche de chaque en-tête définissant uniquement les noms requis par être définis par cet en-tête. Ils ne sont probablement pas aussi stricts à ce sujet que l'exige la norme C, mais beaucoup plus proches qu'ils ne l'étaient (en règle générale).

40
Jerry Coffin

La norme C++ 11 indique que NULL doit être défini dans plusieurs fichiers. Elles sont:

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

Ceci est mentionné dans le tableau 149, section bibliothèque standard C.3 C/3 de la norme.

Voici une image du tableau et du texte environnant.

enter image description here

3
R Sahu

Il est défini dans <cstddef>

La section 18.2 de la norme C++ 11, tableau 30 explique le contenu de <cstddef> Ça dit:

Tableau 30 - En-tête <cstddef> synopsis

Macros: NULL [...]

[...] La macro NULL est une constante de pointeur nul C++ définie par l'implémentation dans la présente Norme internationale

3
Cornstalks