Conflit d'espace de noms cstdio et stdio.h
La bibliothèque standard C inclut l'en-tête cstdio, qui fait partie intégrante de l'espace de noms std. Cependant, il n'est pas rare de rencontrer du code qui mélange les versions stdio.h et std de l'en-tête.
cstdio dans l'espace de noms std
La référence indique que chaque élément de la bibliothèque standard C réside dans l'espace de noms std. Par conséquent, des fonctions telles que printf et scanf font partie de l'espace de noms std et doivent être invoquées en tant que std::printf() et std::scanf().
stdio.h dans l'espace de noms std ?
La situation avec stdio.h est plus nuancée. Selon la norme C 11, l'inclusion de cstdio importe les noms de symboles dans l'espace de noms std, tandis que l'inclusion de stdio.h les importe dans l'espace de noms global. Il en va de même pour les autres en-têtes de style C.
Comportement de fusion des espaces de noms
Cependant, il y a une mise en garde. La norme spécifie que les noms placés dans l'espace de noms std par un en-tête C se comportent également comme s'ils étaient placés dans l'espace de noms global. Cela signifie que des symboles comme printf et scanf, bien que définis principalement dans l'espace de noms std, peuvent également être utilisés sans le préfixe std::.
Implications pratiques
En pratique , cela signifie que le code utilisant à la fois stdio.h et std::cstdio doit inclure l'en-tête stdio.h avant l'en-tête std::cstdio. Cela garantit que les symboles sont déclarés et définis dans l'espace de noms global, permettant leur utilisation sans le préfixe std::.
Conclusion
Bien que l'espace de noms std soit l'espace de noms recommandé moyen d'accéder aux fonctions de la bibliothèque standard C, il est toujours possible d'utiliser les anciens en-têtes C. Cependant, il est important d'être conscient des implications en matière d'espace de noms pour éviter des problèmes potentiels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!