一行代码让我困惑,我无法解决它。它可以是一个函数地址的转换并将它分配给一个函数指针,但是然后“地址”就可以了。不应该在那里。还是我完全脱离了背景?
int32_t (*const my_func)(uint32_t address) = (int32_t (*)(uint32_t address)) nvm_addr;
答案 0 :(得分:15)
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
的一种相当冗长的方式。
答案 1 :(得分:7)
我经常有https://github.com/apache/cordova-plugin-file-transfer
fileTransfer.download(
uri,
fileURL,
function(entry) {
console.log("download complete: " + entry.toURL());
},
function(error) {
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("upload error code" + error.code);
}
);
这样的功能签名:
typedef
在 // signature of function
typedef int32_t my_sigT(uint32_t arg);
我经常命名形式论证(仅为了可读性)。
然后声明一个指向这些函数的常量指针,只需
typedef
我发现在C和C ++中这样做更具可读性......
在C ++ 11中,您可以将 const my_sigT* my_func = (my_sigT*) nvm_addr;
用于closures(非原始函数指针)with std::function<int32_t(uint32_t)>
。
答案 2 :(得分:4)
这是function pointer名为my_func
的声明,该{{3}}正在使用nvm_addr
强制转换为my_func