59 votes

strdup ou _strdup?

Lorsque j'utilise strdup dans Microsoft Visual C++, il me prévient:

avertissement C4996: 'strdup": La POSIX nom pour cet élément est déprécié. Au lieu de cela, utiliser la norme ISO C++ conforme nom: _strdup. Consultez l'aide en ligne pour plus de détails.

Ainsi, il semble _strdup est correct.

Mais quand j'utilise _strdup de GCC (Fedora Linux OS), le compilateur indique une erreur:

erreur: ‘_strdup' n'a pas été déclarée dans ce champ d'application

Avec GCC et Linux, le compilateur n'affiche pas d'erreur de strdup.

Ce qui est correct - strdup ou _strdup?

Note: j'ai incluent <string.h> dans mon code.

37voto

jpalecek Points 31928

Ce qui est correct?

strdup est parfaitement correct POSIX fonction. Néanmoins, il n'appartient pas à la norme, et le C ANSI standard réserves de certains (au sens large) des classes de noms de fonction pour une utilisation ultérieure. Parmi ceux-ci, il y a

  • Les noms de fonctions qui commencent par str et une lettre minuscule

par conséquent, le MME gars a décidé de remplacer strdup avec _strdup.

Je venais tout juste de continuer à utiliser strdup. Il est peu probable que le C comité définira strdup autre chose que POSIX. Soit #define strdup _strdup ou le silence de l'avertissement.

BTW j'espère vous voir cela s'applique à vos fonctions avec des noms comme string_list etc., trop.

34voto

Cheers and hth. - Alf Points 59647

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.

24voto

user3465526 Points 41

Vous pouvez #define _CRT_NONSTDC_NO_DEPRECATE pour désactiver cet avertissement.

8voto

hdante Points 2192

strdup est POSIX:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html

_strdup est spécifique de Windows:

http://msdn.microsoft.com/en-us/library/y471khhc(v=vs. 80).aspx

Sur Unix, utilisez strdup. Sur Windows, l'utilisation _strdup. C'est aussi simple que cela. Si vous avez besoin d'écrire du code portable entre Unix et Windows:

  • l'utilisation dépend du système de macros (par exemple _WIN32 vs _POSIX_VERSION) pour sélectionner la fonction appropriée (mais notez que les macros peuvent dépendent de pré existant inclure des fichiers):

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html

http://msdn.microsoft.com/en-us/library/b0084kay(v=vs. 80).aspx

  • utiliser les fonctions standard de réimplémenter strdup: strlen, malloc et memmove.

  • utiliser une plate-forme de l'utilitaire de bibliothèque, comme glib:

http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup

Notez que Visual C++ message suggère que _strdup appartient à la norme C++, mais c'est faux, car il peut être vérifié sur le C++ standard. Il utilise simplement le trait de soulignement préfixe comme un "espace de noms" de la fonction.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf

5voto

pmg Points 52636

Je ne sais pas à propos de C ++.

La norme C ne décrit aucune fonction portant le nom strdup (bien que le nom soit réservé). Pour être portable, en C, vous feriez mieux de le remplacer par malloc , strcpy et free .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X