3
votes

Méthode standard C ++ pour appeler les fonctions de bibliothèque standard C

J'ai quelques questions sur l'appel des fonctions de bibliothèque standard C en C ++:

  1. Si je veux appeler getline () qui est déclaré dans est-il toujours suffisant d'inclure simplement ? 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>
  2. 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 () .
  3. 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 commentaires

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.


3 Réponses :


4
votes

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 getline code> en C. Mais il y en a une en C ++:

std::getline()

est défini dans l'en-tête . 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.

Référence: https://en.cppreference.com/w/cpp/string/basic_string/getline


1 commentaires

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 .



2
votes

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.


1 commentaires

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



0
votes

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".


0 commentaires