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.
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.
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.
Vous pouvez #define _CRT_NONSTDC_NO_DEPRECATE pour désactiver cet avertissement.
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
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
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