strdup ou _strdup?

Lorsque j’utilise strdup dans Microsoft Visual C ++, il m’avertit:

warning 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.

Ainsi, il semble 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 scope

Avec GCC et Linux, le compilateur ne montre aucune erreur pour strdup .

Lequel est correct – strdup ou _strdup ?

Remarque: dans mon code.

strdup n’est pas une fonction C ++ standard. mais c’est apparemment une fonction de 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 des collisions de noms possibles 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 classes (larges) 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 à utiliser strdup . Il est peu probable que le comité C définisse strdup sur autre chose que POSIX. Soit #define strdup _strdup ou #define strdup _strdup taire l’avertissement.

BTW j’espère que vous voyez ceci s’applique à vos fonctions avec des noms comme ssortingng_list etc., aussi.

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

Si vous voulez juste éviter le message d’avertissement:

Project-> property -> C / C ++ -> Préprocesseur -> Définitions de préprocesseur

Éditez ceci et ajoutez

_CRT_NONSTDC_NO_DEPRECATE

Je ne connais pas le C ++.

La norme C ne décrit aucune fonction avec le nom strdup (bien que le nom soit réservé). Pour être portable, en C, il est préférable de remplacer cela par malloc , strcpy et free .

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 avez besoin d’écrire du code portable entre Unix et Windows:

  • utilisez des macros dépendantes du système (par exemple _WIN32 ou _POSIX_VERSION) pour sélectionner la fonction appropriée (mais notez que les macros peuvent dépendre de fichiers d’inclusion 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.

  • utilisez une bibliothèque d’utilitaires multi-plateformes, comme glib:

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

Notez que le message Visual C ++ suggère que _strdup appartient à la norme C ++, mais cela est faux , car il peut être vérifié sur le standard 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

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