Je vois cette ligne de la référence c ++ pour cstdio
:
Chaque élément de la bibliothèque est défini dans le std namespace
. mais j'ai essayé le code:
std::printf("hello world");
printf("hello world");
est-il vrai que les en-têtes C++ mettent les noms à la fois dans l'espace de noms std et global ?
L'inclusion de cstdio
importe les noms des symboles dans l'espace de noms std
et éventuellement dans l'espace de noms Global.
Comprenant stdio.h
importe les noms de symboles dans l'espace de noms Global et éventuellement dans std
l'espace de noms.
La même chose s'applique à tous les en-têtes de style C.
Référence:
Norme C++ 11
L'annexe D (normative) Caractéristiques de compatibilité [depr] indique:
en-têtes de bibliothèque standard D.6 C
1 Pour la compatibilité avec la bibliothèque standard C et C Unicode TR, la bibliothèque standard C++ fournit les 25 en-têtes C, comme indiqué dans le tableau 151.
Qui inclut:
<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h>
<complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h>
<ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h>
<errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h>
<fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>
Plus loin,
2 Chaque en-tête C, dont chacun a un nom de la forme
name.h
, se comporte comme si chaque nom placé dans l'espace de noms de bibliothèque standard par lecname header
est placé dans la portée de l'espace de noms global. Il n'est pas spécifié si ces noms sont d'abord déclarés ou définis dans la portée de l'espace de noms (3.3.6) de l'espace de noms std et sont ensuite injectés dans la portée de l'espace de noms globaux par des déclarations d'utilisation explicites. (7.3.3).3 [Exemple: l'en-tête
<cstdlib>
fournit assurément ses déclarations et définitions dans l'espace de noms std. Il peut également fournir ces noms dans l'espace de noms global. L'en-tête<stdlib.h>
fournit assurément les mêmes déclarations et définitions dans l'espace de noms global, tout comme dans la norme C. Il peut également fournir ces noms dans l'espace de noms std. —Fin exemple]
Selon les documents de libstdc ++:
La norme spécifie que si l'on inclut l'en-tête de style C (
<math.h>
dans ce cas), les symboles seront disponibles dans l'espace de noms global et peut-être dans l'espace de noms std :: (mais ce n'est plus une exigence ferme .) D'un autre côté, y compris l'en-tête de style C++ (<cmath>
) garantit que les entités seront trouvées dans l'espace de noms std et peut-être dans l'espace de noms global.
http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html