2015-12-22 18 views
5

Stavo guardando questo boot loader open source e ho visto questa riga di codice. Cosa sta succedendo nell'ultima riga? È una specie di puntatore a una funzione, con un cast in un indirizzo?Che follia è questo gruppo di cast

uint8_t ret = init_api(); 
    uint16_t ptr; 
    ptr = PGM_READ_WORD(JUMP_TABLE_INDEX(6)); 

    ret = ((uint8_t(*)(uint32_t, uint8_t *, uint8_t)) ptr)(addr, data, erase); 
+2

Follia ?? QUESTO È C! –

risposta

14

ptr è realizzata mediante fusione a un puntatore a una funzione

uint8_t f(uint32_t, uint8_t *, uint8_t) 

e la funzione viene chiamata con parametri addr, data, erase.

+3

Si noti inoltre che la tabella di salto a cui fa riferimento la macro JUMP_TABLE_INDEX è molto probabilmente una matrice di puntatori di funzione, pertanto la macro restituisce l'indirizzo e l'ultima riga del codice sopra chiama effettivamente la funzione a cui fa riferimento il sesto elemento della tabella di salto. – bruceg

+0

In casi come questo, è più leggibile digitare typoper il tipo di puntatore, quindi lanciare 'ptr' su quel tipo. – Jerry101

Problemi correlati