Синтаксис - вероятный указатель функции

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

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

Ответ 1

int32_t (*const my_func)(uint32_t address)

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

(int32_t (*)(uint32_t address)) nvm_addr

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

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

Ответ 2

У меня часто есть typedef для таких сигнатур функций:

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

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

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

 const my_sigT* my_func = (my_sigT*) nvm_addr;

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

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

Ответ 3

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