Lorsque j'utilise strdup
dans Microsoft Visual C++, il m'avertit:
avertissement C4996: 'strdup': le nom POSIX de cet élément est obsolète. Utilisez plutôt le nom conforme ISO C++: _strdup. Voir l'aide en ligne pour plus de détails.
Il semble donc _strdup
est correct.
Mais quand j'utilise _strdup
dans GCC (Fedora Linux OS), le compilateur affiche une erreur:
erreur: "_strdup" n’a pas été déclaré dans cette étendue
Avec GCC et Linux, le compilateur n'affiche aucune erreur pour strdup
.
Ce qui est correct - strdup
ou _strdup
?
Remarque: j'inclus <string.h>
dans mon code.
strdup
n'est pas une fonction C++ standard. mais c'est apparemment une fonction Posix, et de toute façon c'est une fonction bien connue qui existe depuis K&R C. donc si vous devez absolument l'utiliser, ne vous inquiétez pas d'une éventuelle collision de nom, et écrivez simplement strdup
pour une portabilité maximale.
Qui est correct?
strdup
est une fonction POSIX parfaitement correcte. Néanmoins, il n'appartient pas à la norme, et la norme ANSI C réserve certaines (larges) classes de noms de fonctions pour une utilisation ultérieure. Parmi ceux-ci, il y a
par conséquent, les gars de MS ont décidé de remplacer strdup
par _strdup
.
Je continuerais simplement d'utiliser strdup
. Il est peu probable que le comité C définisse strdup
pour autre chose que POSIX. Non plus #define strdup _strdup
ou désactiver l'avertissement.
BTW J'espère que vous voyez que cela s'applique à vos fonctions avec des noms comme string_list
etc. aussi.
Vous pouvez #define _ CRT_NONSTDC_NO_DEPRECATE pour désactiver cet avertissement.
Si vous souhaitez simplement éviter le message d'avertissement:
Projet-> propriété -> C/C++ -> Préprocesseur -> Définitions du préprocesseur
Modifiez ceci et ajoutez
_CRT_NONSTDC_NO_DEPRECATE
strdup est POSIX:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html
_strdup est spécifique à Windows:
http://msdn.Microsoft.com/en-us/library/y471khhc (v = vs.80) .aspx
Sous Unix, utilisez strdup. Sous Windows, utilisez _strdup. C'est si simple. Si vous devez écrire du code portable entre Unix et Windows:
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
http://msdn.Microsoft.com/en-us/library/b0084kay (v = vs.80) .aspx
utiliser des fonctions standard pour réimplémenter strdup: strlen, malloc et memmove.
utiliser une bibliothèque utilitaire multiplateforme, comme glib:
http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup
Notez que le message Visual C++ suggère que _strdup appartient à la norme C++, mais c'est faux , car il peut être vérifié sur la norme C++. Il utilise simplement le préfixe de soulignement comme un "espace de noms" pour la fonction.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf
Je ne connais pas C++.
C Standard ne décrit aucune fonction avec le nom strdup
(bien que le nom soit réservé). Pour être portable, en C, il vaut mieux remplacer cela par malloc
, strcpy
et free
.