【发布时间】:2010-10-12 07:27:47
【问题描述】:
我在使用 C 的嵌入式硬件中遇到了这个问题。
#define EnterPWDN(clkcon) ( (void (*)(int))0xc0080e0 ) (clkcon)
我不知道这个函数宏是如何工作的。我知道clkcon 是 EnterPWDN 的函数参数,但是之后发生了什么?
【问题讨论】:
我在使用 C 的嵌入式硬件中遇到了这个问题。
#define EnterPWDN(clkcon) ( (void (*)(int))0xc0080e0 ) (clkcon)
我不知道这个函数宏是如何工作的。我知道clkcon 是 EnterPWDN 的函数参数,但是之后发生了什么?
【问题讨论】:
它将地址0xc0080e0 转换为指向函数的指针,该函数接受int 并返回void,并调用该函数,将clkcon 作为参数传递。
拼写:
typedef void (func_ptr*)(int);
func_ptr func = (func_ptr)0xc0080e0;
func(clkcon);
(如果您还没有遇到函数指针,您可能想grab a good C introduction 并阅读该主题。)
【讨论】:
它是一个以 int 作为参数的 void 函数指针。该函数保存在特定的内存地址 0xc0080e0。
(void (*)(int))
以上是函数指针声明。首先是 void 返回类型。接下来的事实是它是一个指针,最后是 int 告诉你函数的参数是什么。内存地址是函数存储的位置,整个过程就是将该内存地址转换为正确的函数指针类型,然后调用函数并将“clkcon”传递给它。
【讨论】: