我在 main() 中单击了以下内容(来自 LPC17xx 接口 uSD 代码)
xdev_in(uart0_getc);
我得到了这个
#define xdev_in(func) xfunc_in = (unsigned char(*)(void))(func)
这个语法是什么意思?
xfunc_in = (unsigned char(*)(void))(func)
我在 main() 中单击了以下内容(来自 LPC17xx 接口 uSD 代码)
xdev_in(uart0_getc);
我得到了这个
#define xdev_in(func) xfunc_in = (unsigned char(*)(void))(func)
这个语法是什么意思?
xfunc_in = (unsigned char(*)(void))(func)
总而言之,据我所知,这就是正在发生的事情:
有一个定义:
#define xdev_in(func) xfunc_in = (unsigned char(*)(void))(func)
该声明:
xdev_in(uart0_getc);
等同于打字:
xfunc_in = (unsigned char (*)(void))(uart0_getc);
这很可能意味着以下内容:
在语句xfunc_in
下方的代码中以某种形式使用了一个通用函数指针。xdev_in(uart0_getc)
这是“指向”形式的一个功能:
unsigned char uart0_getc(void);
现在 uart0_getc 实际上可能没有像上面那样声明它可能是一个不同的函数、函数指针或 void * 或其他;但在进入之前,让我们解释一下片段unsigned char (*)(void)
它是一个函数指针类型(没有分配变量或类型名称),将指向形式为 unsigned char foo(void); 的函数;但是,该片段中没有变量名;这就像我说char
没有变量名的类型一样。
现在是()
外部:然后将整个片段放在括号内()
以创建对该函数指针类型的类型转换。
然后应用于 uart0_getc 以将 uart0_getc 值类型转换为该函数指针类型。
这与例如采用一种简单类型并将其转换为另一种简单类型的概念相同:
int c = (int)'A'; /* type cast character A to an int */
但是,它是通过函数指针完成的。
如果您阅读函数指针,您将理解语法。
如果您不知道什么是类型转换,那么在查看函数指针类型定义和类型转换之前,您需要先了解这一点。
C 预处理器将检查您的代码并在编译之前将代码替换为该定义;它是一个所谓的类函数宏。
将xdev_in(func)
扩展为(替换为) xfunc_in = (unsigned char(*)(void))(func)
。
请注意,在定义中,func
是一个参数;所以你的代码可能xdev_in(x)
会被替换为xfunc_in = (unsigned char(*)(void))(x)
.
更多信息:http ://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion