2015-12-22 10 views
5

Ich schaute auf diese Open-Source-Boot-Loader und ich sah diese Codezeile. Was passiert in der letzten Zeile? Ist das eine Art Zeiger auf eine Funktion, mit einer Umwandlung in eine Adresse?Was für ein Wahnsinn ist diese c Gruppe von Casts

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

Verrücktheit ?? Das ist C! –

Antwort

14

ptr wird auf einen Zeiger auf eine Funktion gegossenem

uint8_t f(uint32_t, uint8_t *, uint8_t) 

und die Funktion mit den Parametern addr, data, erase aufgerufen wird.

+3

Beachten Sie auch, dass die vom Makro JUMP_TABLE_INDEX referenzierte Sprungtabelle höchstwahrscheinlich ein Array von Funktionszeigern ist, so dass der Makro die Adresse zurückgibt und die letzte Zeile des obigen Codes tatsächlich die vom 6. Element der Sprungtabelle referenzierte Funktion aufruft. – bruceg

+0

In solchen Fällen ist es besser lesbar, den Typ des Funktionszeigers zu definieren und dann 'ptr' auf diesen Typ zu setzen. – Jerry101