2015-07-17 9 views
12

Una riga di codice mi ha sconcertato e non riesco a risolverlo. Potrebbe essere il casting di un indirizzo di funzione e assegnarlo a un puntatore di funzione, ma quindi 'indirizzo' non dovrebbe essere lì. O sono completamente fuori dal contesto?Sintassi - probabile puntatore di funzione

int32_t (*const my_func)(uint32_t address) = (int32_t (*)(uint32_t address)) nvm_addr; 
+4

Quando si scrive un tipo che definisce un puntatore a funzione, non importa se si nominano gli argomenti, quindi il codice è equivalente a: 'int32_t (* const my_func) (uint32_t) = (int32_t (*) (uint32_t)) nvm_addr; ', ma anche a' int32_t (* const my_func) (uint32_t name1) = (int32_t (*) (uint32_t name2)) nvm_addr; '. – Holt

risposta

15
int32_t (*const my_func)(uint32_t address) 

che una variabile denominata my_func che memorizza un puntatore const a una funzione prendendo un uint32_t e restituendo un int32_t. Il nome del parametro è opzionale, è lì solo per dare un'idea della semantica di quel parametro.

(int32_t (*)(uint32_t address)) nvm_addr 

che getta nvm_addr a un puntatore a una funzione dello stesso tipo come my_func.

Nel complesso, questo è solo un modo piuttosto dettagliato di memorizzare un puntatore a nvm_addr.

4

Questa è la dichiarazione di un function pointer denominato my_func che viene inizializzato con un getto di nvm_addr al tipo di my_func

7

Mi capita spesso di avere un typedef per tali firme di funzione:

// signature of function 
typedef int32_t my_sigT(uint32_t arg); 

Nel typedef spesso mi sto nominando l'argomenti formali (per migliorare la leggibilità solo).

Poi per dichiarare un puntatore costante a queste funzioni, basta

const my_sigT* my_func = (my_sigT*) nvm_addr; 

trovo a fare questo molto più leggibile in C e in C++ ...

In C++ 11, è possibile utilizzare std::function<int32_t(uint32_t)> per closures (non puntatori di funzioni non elaborate) withauto.

+2

C'è un buon articolo sul perché dovresti [usare quasi sempre 'auto'] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/) . Lambdas è un ottimo esempio di quando usare 'auto'. – CoffeeandCode

Problemi correlati