2015-07-17 3 views
12

Строка кода меня озадачила, и я не могу ее решить. Это может быть кастинг адреса функции и назначение его указателю на функцию, но тогда «адрес» не должен быть там. Или я полностью вне контекста?Синтаксис - вероятный указатель функции

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

При написании типа, определяющего указатель на функцию, не имеет значения, называете ли вы аргументы, поэтому ваш код эквивалентен: 'int32_t (* const my_func) (uint32_t) = (int32_t (*) (uint32_t)) nvm_addr; ', но также и' int32_t (* const my_func) (uint32_t name1) = (int32_t (*) (uint32_t name2)) nvm_addr; '. – Holt

ответ

15
int32_t (*const my_func)(uint32_t address) 

Это переменная называется my_func, которая хранит константный указатель на функцию взяв uint32_t и вернув int32_t. Имя параметра является необязательным, оно просто дает представление о семантике этого параметра.

(int32_t (*)(uint32_t address)) nvm_addr 

Это бросает nvm_addr на указатель на функцию того же типа, как my_func.

В целом, это довольно верный способ хранения указателя функции на nvm_addr.

7

Я часто имеют typedef для таких функций подписи:

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

В typedef я часто называя формальные аргументы (для удобочитаемости только).

Затем объявить константный указатель на такие функции, как раз

const my_sigT* my_func = (my_sigT*) nvm_addr; 

Я считаю, делать это гораздо более удобным для чтения в C и C++ ...

В C++ 11, вы можете использовать std::function<int32_t(uint32_t)> для closures (не сырые указатели функций) withauto.

+2

Существует хорошая статья о том, почему вы должны [почти всегда использовать 'auto'] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/) , Lambdas - яркий пример того, когда использовать 'auto'. – CoffeeandCode