Différence entre <cstring> et <string>
Plus tôt aujourd'hui (en fait, hier, à cause de mon fuseau horaire), j'ai été de tenter de programmation entrevue à l'aide d' Visual Studio 2012 pour C++ sur l'Entretien de la Rue (qui utilise g++).
Pour être bref, je suis tombé sur plusieurs erreurs de compilation1 quand j'ai été en utilisant
#include <cstring>
qui a été fourni par le squelette de code dans un de la question, et après la mise à
#include <string>
toutes les erreurs de compilation comme par magie disparu.
Cependant, lors de la présentation à l'Interview de la Rue, j'ai dû ajouter c
dos, sinon j'ai des erreurs de compilation.
C'était la première fois que j'ai été mordu par des non-normalisation....
Ma question est: est ce que à l'intérieur de <string>
et <cstring>
m'a pris (précieux) plus d'une demi-heure?
1 Pour quelqu'un qui est curieux:
Une erreur par Visual Studio 2012 si using <cstring>
est:
erreur C2338: La Norme C++ n'est pas un hash de ce type.
dans
c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstddef
peut-être pour string
clé dans unordered_map
Une erreur par g++ si using <string>
est:
'strlen' n'a pas été déclarée dans ce cadre
Vous devez vous connecter pour publier un commentaire.
La
cstring
en-tête fournit des fonctions pour traiter les C-style cordes, null tableaux de caractères. Cela inclut des fonctions commestrlen
etstrcpy
. C'est le C++ version de la classiquestring.h
en-tête de C.La
string
en-tête donne lestd::string
de classe et d'autres fonctions et d'opérateurs.Les en-têtes ont des noms similaires, mais ils ne sont pas vraiment liés au-delà. Ils couvrent des tâches distinctes.
<string>
pourstring
, tandis que Visual Studio ne semblent pas avoir besoin<cstring>
pour c genre de choses. Pourquoi?string
de tous les autres en-têtes que vous avez déjà compris, commeiostream
. De même pourcstring
. Toujours inclure tous les en-têtes dont vous avez besoin. Ne comptez pas sur votre environnement spécifique suppose implicitement certains d'entre eux pour vous; vous pourrez rencontrer des problèmes si vous avez besoin de votre code pour être portable, ou si vous modifiez les versions du compilateur et de la nouvelle version dispose de différents implicite en-tête de dépendances.#include <cstring>
dans les en-têtes de vous comprendre, et gcc ajoute#include <string>
dans certains d'en-tête que vous avez inclus. Vous doit include deux depuis votre code dépend à la fois de les en-têtes.<cstring>
a la chaîne C du code de l'en-tête C de la chaîne.h.C++
a une convention oùC
les en-têtes ont le même nom de base, sauf pour l'un des principauxc
et pas de fuite.h
. Tout le contenu est disponible sous lastd::
espace de noms.<string>
a la bibliothèque standardstd::string
et des fonctions liées à<string>
pourstring
, tandis que Visual Studio ne semblent pas avoir besoin<cstring>
pour c genre de choses. Pourquoi?<string>
doit être inclus dans un en-tête différent. Vous devez toujours inclure<string>
si vous en avez besoin. Je ne pense pas qu'il y est tout d'en-tête standard qui est garanti pour l'inclure.En C++, vous ne l'utilisez
#include <somefile.h>
, mais au lieu#include <somefile>
. Maintenant, C++ dispose de sa chaîne de classes dans<string>
, mais le c-string fonctions sont également disponibles, ce qui serait<string.h>
. C++ utilise pour "traditionnelle", c - inclure des fichiers. Par conséquent,<cstring>
et<string>
http://www.cplusplus.com/reference/clibrary/cstring/
<string>
pourstring
, tandis que Visual Studio ne semblent pas avoir besoin<cstring>
pour c genre de choses. Pourquoi?