2013-06-29 32 views
-3

不明语法我点击下面的main()的(这是LPC17xx界面USD代码)用的#define

xdev_in(uart0_getc); 

,我得到这个

#define xdev_in(func) xfunc_in = (unsigned char(*)(void))(func) 

是什么语法是什么意思?

xfunc_in = (unsigned char(*)(void))(func) 
+0

xfunc_in的数据类型是什么? – Chinna

+0

没有其他信息的情况下,一行内容难以分析。请[编辑]提供更多细节。 (如果你把这一行放在一个源文件中并试图编译它,编译器也不能解析它,它需要更多的上下文。) –

+0

抱歉,不确定 –

回答

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

+0

这个语法怎么样? xfunc_in =(unsigned char(*)(void))(func) –

+0

您没有提供任何上下文来调用该函数。猜测它是将某些东西当作指针。 – Leigh

+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 */ 

但是它正在与函数指针来完成。

如果您阅读函数指针,您将会理解语法。

如果你不知道什么是类型转换,那么在查看函数指针类型定义和类型转换之前,你需要先理解它。