J'ai quelques questions sur l'appel des fonctions de bibliothèque standard C en C ++:
getline ()
qui est déclaré dans
est-il toujours suffisant d'inclure simplement code >? Cela fonctionne avec le compilateur que j'utilise et je vois qu'il inclut
dans
mais je veux savoir si le standard le garantit. < / li>
- Toutes les fonctions de bibliothèque standard C sont-elles garanties disponibles en C ++? Avec l'exemple
getline ()
ci-dessus, j'ai remarqué que sur cppreference sous
il ne répertorie pas getline ()
.
- Pour les fonctions et types de bibliothèque standard C qui sont rendus disponibles dans l'espace de noms
std ::
comme FILE
ou malloc ()
sont-ils des problèmes d'accès via l'espace de noms global ou est-il simplement plus idiomatique d'y accéder en tant que std :: FILE
ou std :: malloc ()
?
3 Réponses :
Vous devez toujours inclure ce que la documentation vous dit. (Les implémentations de bibliothèques standard C ++ seront souvent écrites de telle sorte que les fonctions soient accessibles via d'autres includes, mais bien sûr, compter sur cela signifie que votre code n'est pas portable.) Notez qu'il n'y a pas de standard est défini dans l'en-tête Référence: https://en.cppreference.com/w/cpp/string/basic_string/getline getline code> en C. Mais il y en a une en C ++:
std::getline()
. Le standard C ++ ne garantit pas qu'en général, les fonctions C sont disponibles à portée globale ou font même partie de la bibliothèque standard C ++. Les deux langages ont commencé leur divergence il y a de nombreuses années et donc l'idée que C ++ est en un sens un sur-ensemble de C - bibliothèques incluses - est un mythe.
Il s'avère que je faisais référence à POSIX getline ()
comme l'a souligné @molbdnilo. Concernant votre dernier point, j'avais lu cette réponse précédente qui semblait indiquer que la norme C ++ garantit que les fonctions C sont disponibles à l'échelle mondiale si vous incluez le fichier d'en-tête C comme stdio.h
.
En ce qui concerne # 3 :
Les bibliothèques .h
doivent placer tous ses noms dans l'espace de noms global et peuvent également les placer dans l'espace de noms std ::
.
La version de début de c
doit placer tous ses noms dans l'espace de noms std ::
et peut également les placer dans l'espace de noms global.
C'est ce que j'ai lu dans la réponse précédente que j'ai liée mais @bathsheba semble dire le contraire: Le standard C ++ ne garantit pas que, en général, les fonctions C sont disponibles à portée globale
Il devrait être facile de lier n'importe quelle bibliothèque C avec C ++ en général, pas seulement les en-têtes standard.
Notez que vous devrez peut-être parcourir man pour déterminer quelle version de quel Unix la méthode a été introduite ou s'il s'agit d'une extension spécifique, et décider par vous-même si ce point de départ historique est acceptable pour vous. Mais c'est vrai si vous avez écrit un programme C au lieu de C ++.
Les en-têtes d'alias C ++ incluent la plupart, mais pas toutes les fonctionnalités des en-têtes C, mais parfois vous pouvez trouver le seul moyen d'obtenir un La fonction est d'inclure directement l'en-tête C. D'un autre côté, vous devez vous demander pourquoi ils ont choisi de ne pas inclure cette méthode, généralement parce qu'elle est obsolète, dangereuse ou non standard.
Donc, la façon dont cela fonctionne, c'est que C fonctionne, y compris Les fonctions de la bibliothèque C sont introduites avec le mot-clé extern "C"
.
Lorsque vous #incluez les fichiers d'en-tête C, ils contiennent généralement du code tel que:
extern "C" { #include "ancientinterface.h" };
... qui introduit une section des fonctions de l'interface C.
Si vous aviez besoin d'inclure une très ancienne bibliothèque C qui ne le faisait pas, alors vous pourriez facilement ajouter extern "C"
autour du #include:
/* C++ needs to know that types and declarations are C, not C++. */ #ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } #else # define __BEGIN_DECLS # define __END_DECLS #endif __BEGIN_DECLS
Vous pouvez également écrire vos propres méthodes compatibles avec l'interface "C".
getline
n'est pas une fonction de bibliothèque standard C, c'est POSIX. S'il est disponible dans la bibliothèque C de votre compilateur, il est disponible en C ++.En supposant que ce soit la POSIX
getline
fonction vous y réfléchissez, il n'y a aucune garantie que
le déclarera. Ce sera probablement le cas, mais aucune garantie car il ne fait partie ni du C ++ standard ni du C.Vous avez raison, j'ai manqué que c'est une fonction POSIX et qui répond à mes 2 premières questions ci-dessus.