我点击了main()中的以下内容(这是来自LPC17xx接口的uSD代码)
xdev_in(uart0_getc);
我得到了这个
#define xdev_in(func) xfunc_in = (unsigned char(*)(void))(func)
这种语法是什么意思?
xfunc_in = (unsigned char(*)(void))(func)
答案 0 :(得分:2)
有一个定义:
#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 */
然而,它是用函数指针完成的。
如果您阅读了函数指针,您将理解语法。
如果您不知道什么类型的转换,那么在查看函数指针类型定义和类型转换之前,您需要先了解它。
答案 1 :(得分:1)
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