c++ - strdup o_strdup?
visual-studio (7)
¿Cual es correcta?
strdup
es una función POSIX perfectamente correcta. Sin embargo, no pertenece al estándar, y el estándar ANSI C reserva algunas clases (amplias) de nombres de funciones para su uso posterior. Entre estos, hay
- Nombres de funciones que comienzan con str y una letra minúscula
por lo tanto, los chicos de MS decidieron reemplazar strdup
con _strdup
.
Yo solo seguiría usando strdup
. Es poco probable que el comité C definirá strdup
a algo más que POSIX. Ya sea #define strdup _strdup
o silenciar la advertencia.
Por cierto, espero que veas que esto se aplica a tus funciones con nombres como string_list
, etc.
Cuando uso strdup
en Microsoft Visual C ++, me advierte:
advertencia C4996: ''strdup'': el nombre POSIX para este elemento está en desuso. En su lugar, use el nombre conforme con ISO C ++: _strdup. Consulte la ayuda en línea para obtener detalles.
Por lo tanto, parece que _strdup
es correcto.
Pero cuando uso _strdup
en GCC (Fedora Linux OS), el compilador muestra un error:
error: ''_strdup'' no fue declarado en este ámbito
Con GCC y Linux, el compilador no muestra ningún error para strdup
.
¿Cuál es correcto - strdup
o _strdup
?
Nota: <string.h>
en mi código.
No sé sobre C ++.
El estándar C no describe ninguna función con el nombre strdup
(aunque el nombre está reservado). Para ser portátil, en C, es mejor reemplazarlo con malloc
, strcpy
y free
.
Puede # _CRT_NONSTDC_NO_DEPRECATE para desactivar esta advertencia.
Si solo quieres evitar el mensaje de advertencia:
Proyecto-> propiedad -> C / C ++ -> Preprocesador -> Definiciones de preprocesador
Edita esto y agrega
_CRT_NONSTDC_NO_DEPRECATE
no es una advertencia sino un error informado en una versión superior de vs.
usa la macro #ifdef WIN32
para cambiar
strdup es POSIX:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html
_strdup es específico de Windows:
http://msdn.microsoft.com/en-us/library/y471khhc(v=vs.80).aspx
En Unix, use strdup. En Windows, use _strdup. Es así de simple. Si necesita escribir un código portátil entre Unix y Windows:
- utilice macros dependientes del sistema (por ejemplo _WIN32 contra _POSIX_VERSION) para seleccionar la función adecuada (pero tenga en cuenta que las macros pueden depender de archivos de inclusión preexistentes específicos):
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx
utilice funciones estándar para volver a implementar strdup: strlen, malloc y memmove.
utilice una biblioteca de utilidad multiplataforma, como glib:
http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup
Tenga en cuenta que el mensaje de Visual C ++ sugiere que _strdup pertenece al estándar de C ++, pero esto es falso , ya que se puede verificar en el estándar de C ++. Simplemente utiliza el prefijo de subrayado como un "espacio de nombre" para la función.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf
strdup
no es una función estándar de C ++. pero aparentemente es una función de Posix, y de todos modos es una función bien conocida que ha estado allí desde K & R C. así que si absolutamente debes usarla, no te preocupes por cualquier posible colisión de nombres, y simplemente escribe strdup
para una máxima portabilidad.