web-dev-qa-db-fra.com

strdup ou _strdup?

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.

54
Amir Saniyan

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.

29

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

  • Noms de fonctions commençant par str et une lettre minuscule

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.

34
jpalecek

Vous pouvez #define _ CRT_NONSTDC_NO_DEPRECATE pour désactiver cet avertissement.

19
David Bremner

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

9
Darós

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:

  • utilisez des macros dépendantes du système (par exemple _WIN32 vs _POSIX_VERSION) pour sélectionner la fonction appropriée (mais notez que les macros peuvent dépendre de fichiers include préexistants spécifiques):

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

7
hdante

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.

5
pmg