2012-09-03 14 views
6

Sto sperimentando con XCode e sto provando a compilare il codice di Windows di qualcun altro.Perché sto ricevendo "Uso dell'identificatore non dichiarato 'malloc'"?

C'è questo:

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; 
} 

Questo è in un file di intestazione.

E mi chiama fuori su

L'utilizzo di identificatore non dichiarato 'malloc'

E anche per strlen, memcpy e gratuito.

Cosa sta succedendo? Scusa se questo è dolorosamente semplice, sono nuovo di C e C++

+1

stai includendo stdlib.h? –

+0

@WillAyd L'ho appena incluso e gli errori sono stati ridotti a strlen e memcpy ora. Grazie, ma per quanto riguarda questi 2? –

risposta

18

XCode ti sta dicendo che stai usando qualcosa chiamato malloc, ma non ha idea di cosa sia Malloc. Il modo migliore per farlo è quello di aggiungere il seguente al codice:

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

In linee C e C++ che iniziano con # sono comandi per il pre-processore. In questo esempio, il comando # include estrae il contenuto completo di un altro file. Sarà come se avessi digitato tu stesso il contenuto di stdlib.h. Se fai clic con il tasto destro sulla linea #include e seleziona "vai alla definizione" XCode aprirà stdlib.h. Se si cerca attraverso stdlib.h troverete:

void *malloc(size_t); 

che dice al compilatore che malloc è una funzione è possibile chiamare con un singolo argomento size_t.

È possibile utilizzare il comando "man" per trovare i file di intestazione da includere per altre funzioni.

+0

's/definizioni/dichiarazioni /'. –

+0

Hai ragione! Fisso. – razeh

4

Prima di utilizzare queste funzioni, è necessario includere i file di intestazione che forniscono il loro prototipo.

per malloc & gratis è:

#include <stdlib.h> 

per strlen e memcpy è:

#include <string.h> 

Lei parla anche C++. Queste funzioni provengono dalla libreria standard C. Per utilizzarli dal codice C++ il comprendono linee sarebbero:

#include <cstdlib> 
#include <cstring> 

Tuttavia, si potrebbe ben essere facendo cose in modo diverso in C++ e non intende utilizzare questi.

Problemi correlati