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.
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.
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).
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>
synopsisMacros:
NULL
[...][...] La macro NULL est une constante de pointeur nul C++ définie par l'implémentation dans la présente Norme internationale