2012-09-03 14 views
6

Estoy experimentando con XCode e intentando compilar el código de Windows de otra persona.¿Por qué me sale "Uso del identificador no declarado 'malloc'"?

Hay esta:

inline GMVariable(const char* a) { 
    unsigned int len = strlen(a); 
    char *data = (char*)(malloc(len+13)); 
    if(data==NULL) { 
    } 
    // Apparently the first two bytes are the code page (0xfde9 = UTF8) 
    // and the next two bytes are the number of bytes per character (1). 
    // But it also works if you just set it to 0, apparently. 
    // This is little-endian, so the two first bytes actually go last. 
    *(unsigned int*)(data) = 0x0001fde9; 
    // This is the reference count. I just set it to a high value 
    // so GM doesn't try to free the memory. 
    *(unsigned int*)(data+4) = 1000; 
    // Finally, the length of the string. 
    *(unsigned int*)(data+8) = len; 
    memcpy(data+12, a, len+1); 
    type = 1; 
    real = 0.0; 
    string = data+12; 
    padding = 0; 
} 

Se trata de un archivo de cabecera.

Me llama a cabo en

El uso de identificador no declarado 'malloc'

Y también para strlen, memcpy y libre.

¿Qué está pasando? Lo siento si esto es dolorosamente simple, soy nuevo en C y C++

+1

¿Está usted incluyendo stdlib.h? –

+0

@WillAyd Acabo de incluirlo, y los errores se redujeron a solo strlen y memcpy ahora. Gracias, pero ¿qué hay de estos 2? –

Respuesta

18

XCode le dice que está utilizando algo llamado malloc, pero no tiene idea de qué es malloc. La mejor manera de hacer esto es añadir lo siguiente a su código:

#include <stdlib.h> // pulls in declaration of malloc, free 
#include <string.h> // pulls in declaration for strlen. 

En líneas C y C++ que comienzan con # son comandos para el pre-procesador. En este ejemplo, el comando #include extrae los contenidos completos de otro archivo. Será como si hubiera escrito el contenido de stdlib.h usted mismo. Si hace clic derecho en la línea #include y selecciona "ir a la definición", XCode abrirá stdlib.h. Si usted busca a través stdlib.h encontrará:

void *malloc(size_t); 

que le dice al compilador que malloc es una función que puede llamar con un solo argumento size_t.

Puede usar el comando "man" para encontrar qué archivos de encabezado incluir para otras funciones.

+0

's/definitions/declarations /'. –

+0

¡Tienes razón! Fijo. – razeh

4

Antes de usar estas funciones, debe incluir los archivos de encabezado que proporcionan su prototipo.

para malloc & libre es:

#include <stdlib.h> 

para strlen y establecimiento de memoria es:

#include <string.h> 

También menciona C++. Estas funciones son de la biblioteca estándar de C. Para utilizarlas desde el código C++ incluyen líneas serían:

#include <cstdlib> 
#include <cstring> 

Sin embargo, también podría estar haciendo las cosas de manera diferente en C++ y no va a utilizar estos.

Cuestiones relacionadas