我有微控制器,我正在与他合作.在调试时,必须调用一个在ROM中硬编码的函数.技术参考显示了如何执行此操作:
# define Device_cal (void(*)(void))0x3D7C80
Run Code Online (Sandbox Code Playgroud)
和调用过程看起来像这样:
(*Device_cal)()
Run Code Online (Sandbox Code Playgroud)
我无法理解这里究竟发生了什么,所以我的问题是:它是如何工作的?
void (*) (void)
是一种类型.它是一个指向函数的指针,它不带参数并返回void
.
(void(*)(void)) 0x3D7C80
将0x3D7C80
整数强制转换为此函数指针.
(*Device_cal)()
调用该函数.
(Device_cal)()
会做同样的事情.
围绕*Device_cal
和括号Device_cal
是必需的,否则对整数的强制转换将不具有更高的优先级.
编译前立即展开的#define
原因:(*Device_cal)()
(*(void(*)(void))0x3D7C80)()
Run Code Online (Sandbox Code Playgroud)
这是一个接受和返回类型void(*)(void)
的函数指针的声明。表示表达式 ( ) 中下一个标记的强制转换。因此,这要求将位置处的数据视为函数。最终调用不带参数的函数。void
void
(*())
0x3D7C80
0x3D7C80
()