c++ c visual-studio strdup

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 .



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.