2010-10-20 25 views
27

Sto cercando di capire che cosa questo significa, il codice sto guardando haChe cosa significa "typedef void (* qualcosa)()" significa

in .h

typedef void (*MCB)(); 
static MCB  m_process; 

a .C

MCB Modes::m_process = NULL; 

E a volte quando faccio

m_process(); 

I ottenere errori di segmentazione, è probabilmente perché la memoria è stata liberata, come posso eseguire il debug quando viene liberata?

Spero che le mie domande siano chiare.

+9

Hey - stai parlando C o C++ ? Il tuo file .C indica C++; i tuoi tag indicano C. Pensaci: c'è una grande differenza tra le due lingue qui. –

+6

Questo è sicuramente C++. '.C' è un'estensione di file C++ comune e inoltre' Modes :: m_process' non sarebbe valida C. – SingleNegationElimination

+0

L'autore ha chiaramente specificato il tag, ha chiesto di C e l'ha modificato più volte in C. inizialmente confuso del codice con altri, è un'altra discussione. La risposta è giusta, rispondendo a un frammento di C. – another

risposta

37

Definisce un tipo di puntatore a funzione. Le funzioni restituiscono void e l'elenco degli argomenti non è specificato perché la domanda è (attualmente, ma possibilmente erroneamente) taggata C; se fosse codificato in C++, la funzione non accetta affatto argomenti. Per rendere una funzione che non prende argomenti (in C), utilizza:

typedef void (*MCB)(void); 

Questo è uno dei settori in cui v'è una differenza significativa tra C, che non lo fa - ancora - richiedono tutte le funzioni essere prototipo prima di essere definito o usato, e C++, che lo fa.

+1

Preferirei che il codice venga compilato come C++, a causa della seconda riga nella domanda originale che utilizza l'operatore di risoluzione dell'ambito. Ancora, +1 per essere tecnicamente corretto. –

+1

Ho eliminato il mio, poiché è effettivamente contrassegnato da C. Stavo guardando il codice, anche se così ho pensato al C++. Il tuo copre entrambi, comunque, quindi +1 a quello. – GManNickG

+1

@GMan: Capisco la confusione! –

3

Introduce un tipo di puntatore a funzione, che punta a una funzione che non restituisce nulla (void), non prende alcun parametro e nomina il nuovo tipo MCB.

+1

No - prende parametri non specificati (perché la domanda è codificata C), non i parametri zero (come sarebbe se fosse etichettato C++). –

+0

Sì, e no. Vedi il mio commento alla tua risposta sul motivo per cui penso che rispondere in quel modo specifico (e probabilmente rimettere in discussione la domanda) sia in ordine. –

+0

Capisco e sono d'accordo/comprensivo - Ho modificato la mia risposta per consentire la probabile retagging, e per sottolineare che questa volta * davvero * importa se la domanda riguarda C o C++. –

4

Il typedef definisce MCB come il tipo di puntatore a una funzione che non accetta argomenti e restituisce void.

Si noti che MCB Modes::m_process = NULL; è C++, non C. Inoltre, in C, il typedef dovrebbe essere in realtà typedef void (*MCB)(void);.

Non sono sicuro di cosa intendi per "il ricordo è stato liberato". Hai un puntatore statico a una funzione; una funzione non può essere liberata. Al massimo, il tuo puntatore è stato resettato da qualche parte. Basta eseguire il debug con un orologio di memoria su m_process.

3

È un puntatore di funzione. Si ottiene un GUASTO SEGMENTAZIONE perché si sta tentando di effettuare una chiamata a una funzione il cui indirizzo non è valido (NULL).

In base al campione specifico, la funzione non deve restituire alcun valore (void) e non deve ricevere parametri ().

Questo dovrebbe funzionare:

void a() 
{ 
    printf("Hello!"); 
} 

int main(int arcg, char** argv) 
{ 
    m_process = a; 
    m_process(); /* indirect call to "a" function, */ 
    // Hello! 
} 

puntatori a funzione sono comunemente usati per una qualche forma di gestione in C. evento Non è il suo unico impiego però ...

Problemi correlati