Синтаксис - вероятный указатель функции
Строка кода сбила меня с толку, и я не могу ее разрешить. Это может быть кастинг адреса функции и назначение его указателю на функцию, но тогда "адрес" не должен быть там. Или я полностью вне контекста?
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