2011-04-06 23 views
5

Tengo un código C++ 0x. Pude reproducirlo a continuación. El siguiente código funciona bien sin -std=c++0x sin embargo, lo necesito para mi código real.strdup error en g ++ con C++ 0x

¿Cómo incluyo strdup en C++ 0x? con gcc 4.5.2

Nota que estoy usando mingw. Intenté incluir cstdlib, cstring, string.h y probé con std ::. Sin suerte.

>g++ -std=c++0x a.cpp 
a.cpp: In function 'int main()': 
a.cpp:4:11: error: 'strdup' was not declared in this scope 

código:

#include <string.h> 
int main() 
{ 
    strdup(""); 
    return 0; 
} 
+1

Funciona en gcc 4.5.1. Pruebe '#include' 'y usando' std :: strdup', esa es la "forma de C++". (Todavía no es una respuesta, ya que eso también debería ser válido, IIRC.) – GManNickG

+0

@GMan: modifiqué mi pregunta. Lo intenté y no tuve suerte :(. Como una solución temporal puse extern C '_CRTIMP char * __cdecl __MINGW_NOTHROW \t strdup (const char *) __MINGW_ATTRIB_MALLOC;' en mis encabezados. Funciona con eso. –

Respuesta

8

-std = gnu ++ 0x (en lugar de -std = C++ 0x) me parece el truco; -D_GNU_SOURCE no funcionó (lo intenté con un compilador cruzado, pero tal vez funciona con otros tipos de g ++).

Parece que el valor predeterminado (no -std = ... passed) es "GNU C++" y no "estándar estricto C++", por lo que el indicador "no cambia nada excepto la actualización a C++ 11 "is -std = gnu ++ 0x, not -std = C++ 0x; el último significa "actualizar a C++ 11 y ser más estricto que por defecto".

6

strdup pueden no estar incluidos en la biblioteca que está vinculando en contra (que usted ha mencionado MinGW). No estoy seguro si está en C++ 0x o no; Sé que no está en versiones anteriores de los estándares de C/C++.

Es una función muy simple, y podría simplemente incluirla en su programa (aunque no es legal llamarlo simplemente "strdup" ya que todos los nombres que comienzan con "str" ​​y una letra minúscula están reservados para extensiones de implementación).

char *my_strdup(const char *str) { 
    size_t len = strlen(str); 
    char *x = (char *)malloc(len+1); /* 1 for the null terminator */ 
    if(!x) return NULL; /* malloc could not allocate memory */ 
    memcpy(x,str,len+1); /* copy the string into the new buffer */ 
    return x; 
} 
+0

está reservado pero no es estándar !? –

+1

Cualquier cosa 'str [az] *' está reservada, he editado para aclarar – Random832

+0

'malloc' puede necesitar un molde para' char * '(http://stackoverflow.com/questions/5099669/invalid-conversion-from- void-to-char-when-using-malloc) – Ben

2

This page explica que strdup es conforme, entre otros, a los estándares POSIX y BSD, y que extensiones de GNU implementan. Tal vez si compilas tu código con "-D_GNU_SOURCE", ¿funciona?

EDIT: solo para expandir un poco, es probable que no necesite nada más que incluir cstring en un sistema POSIX. Pero está utilizando GCC en Windows, que no es POSIX, por lo que necesita la definición adicional para habilitar strdup.

0

agregar este preprocesador "_CRT_NONSTDC_NO_DEPRECATE" Proyecto de Properties-> C/C++ Generar-> GCC C++ Compiler-> Preprocessor-> configuración de la herramienta

No se olvide de comprobar preprocesador solamente (-E)

Esto funcionó para mí en windows mingw32.

+0

Esa es una bandera de MSVC. – einpoklum