2015-07-17 11 views
12

Eine Codezeile hat mich verwirrt, und ich kann es nicht lösen. Es könnte eine Funktionsadresse darstellen und sie einem Funktionszeiger zuweisen, aber dann sollte "Adresse" nicht da sein. Oder bin ich völlig aus dem Zusammenhang gerissen?Syntax - wahrscheinliche Funktion Zeiger

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

Beim Schreiben eines Typs, der einen Funktionszeiger definiert, ist es egal, ob Sie die Argumente benennen, also entspricht Ihr Code: 'int32_t (* const my_func) (uint32_t) = (int32_t (*) (uint32_t)) nvm_addr; ', aber auch zu 'int32_t (* const my_func) (uint32_t name1) = (int32_t (*) (uint32_t name2)) nvm_addr;'. – Holt

Antwort

15
int32_t (*const my_func)(uint32_t address) 

dass eine Variable my_func die einen const Zeiger speichert, auf eine Funktion, die aufgerufen wird initialisiert Nehmen Sie eine uint32_t und eine int32_t zurück. Der Parametername ist optional, er gibt nur eine Vorstellung von der Semantik dieses Parameters.

(int32_t (*)(uint32_t address)) nvm_addr 

Das nvm_addr auf einen Zeiger auf eine Funktion desselben Typs wie my_func wirft.

Insgesamt ist dies nur eine ziemlich ausführliche Möglichkeit zum Speichern eines Funktionszeigers auf nvm_addr.

7

Ich habe oft eine typedef für eine solche Funktion Unterschriften:

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

Im typedef ich oft die formalen Argumente bin Benennung (zur besseren Lesbarkeit nur).

Dann einen konstanten Zeiger auf solche Funktionen zu erklären, nur

const my_sigT* my_func = (my_sigT*) nvm_addr; 

ich das viel besser lesbar in C und in C++ ...

In C++ 11, könnten Sie finden zu tun verwenden std::function<int32_t(uint32_t)> für closures (nicht rohe Funktionszeiger) withauto.

+2

Es gibt einen guten Artikel darüber, warum man [fast immer 'auto' verwenden sollte] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/) . Lambdas sind ein Paradebeispiel dafür, wann man 'auto' verwenden soll. – CoffeeandCode