strdup ou strdup?

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

Avertissement C4996: 'strdup': le nom POSIX de cet élément est obsolète. Au lieu de cela, utilisez le nom conforme ISO c++: _strdup. Voir l'aide en ligne pour plus de détails.

Il semble donc que _strdup soit 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 portée

Avec GCC et Linux, le compilateur ne s'affiche pas toute erreur pour strdup.

, Qui est correct - strdup ou _strdup?

Remarque: j'inclus <string.h> dans mon code.

46
demandé sur jrh 2011-09-28 15:17:57

7 réponses

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 noms, et écrivez simplement strdup pour une portabilité maximale.

25
répondu Cheers and hth. - Alf 2011-09-28 22:42:27

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 classes (larges) de noms de fonctions pour une utilisation ultérieure. Parmi ceux-ci, il y a

  • noms de fonction 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 à utiliser strdup. Il est peu probable que le Comité C définira strdup à autre chose que POSIX. Soit #define strdup _strdup ou faire taire l'avertissement.

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

33
répondu jpalecek 2011-09-28 11:46:23

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

19
répondu David Bremner 2014-06-25 23:34:12

Si vous voulez juste éviter le message D'Avertissement:

Projet-> propriété -> C/C++ -> Préprocesseur -> Définitions de Préprocesseur

Modifiez ceci et ajoutez

_CRT_NONSTDC_NO_DEPRECATE

8
répondu Darós 2015-03-26 14:21:56

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 aussi simple que cela. Si vous avez besoin d'é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

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

  • Utilisez une bibliothèque utilitaire multi-plateforme, 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 ceci est false , car il peut être vérifié sur la norme C++. Il utilise simplement le préfixe de soulignement comme "espace de noms" pour la fonction.

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

4
répondu hdante 2012-11-27 01:16:53

Ce n'est pas un avertissement mais une erreur signalée dans la version supérieure de vs.

Utilisez la macro #ifdef WIN32 pour changer

-1
répondu yjjjnls 2017-04-27 08:14:19