请教一个函数指针知识
typedef void (*function)(void);//这么理解 void是一种没有形参和没有返回值的一类函数
//用function函数指针变量代替?
#define Function(address) (*(function)address)()
//先将address强制转换为function类型(函数指针变量)
//(*(function)address)便可以看作一个函数名了,最后用Function(address)代替这个函数名
是不是这么理解呢?对于这个Function(address)宏定义不是很理解,这个Function()括号里面是填函数名吗?还是变量名也行 填地址,一般是常量地址。当然也可以是函数名。 本帖最后由 qiao_zlj 于 2014-7-10 23:01 编辑
#define Function(address) (*(function)address)()
第一次见这么用~感觉好像是对的~
但是这么用感觉不好~容易有歧义~
address必须是地址(函数名),
下面是以前用过的一个函数指针的例子:
struct STRING_ITEM{
char str;
unsigned shortcolor;
};
struct MENU_ITEM{
struct STRING_ITEM message;
void (*key_func)(unsigned char);
struct STRING_ITEM *element;
struct STRING_ITEM *value;
};
static void ch1_menu_key_func(unsigned char code)
{
switch(code)
{
case KEY_SEL1:
if(ch_couple_get(CH1_COUPLE) == AC_COUPLING)
{
sprintf(ch1_e_value.str,"直流");
ch_couple_set(CH1_COUPLE,DC_COUPLING);
}
else
{
sprintf(ch1_e_value.str,"交流");
ch_couple_set(CH1_COUPLE,AC_COUPLING);
}
break;
case KEY_SEL2:
break;
case KEY_SEL3:
break;
case KEY_SEL4:
break;
case KEY_SEL5:break;
default:break;
}
}
struct MENU_ITEM ch1_menu = {
{"CH1",CH1_COULOR},//struct STRING_ITEM message;
ch1_menu_key_func,//void (*key_func)(unsigned char);
&ch1_ele,//struct STRING_ITEM *ele;
&ch1_e_value//struct STRING_ITEM *e_value;
};
current_menu->key_func(key_code);//这是那个函数的调用方式
//如果这么用
//typedef void (*function)(unsigned char);
//结构体里可以写成
//function key_func;
//这里的function表示所定义的函数指针的形参与返回值的组成方式 mcu_lover 发表于 2014-7-10 22:55
填地址,一般是常量地址。当然也可以是函数名。
那么这儿Function(常量),这样是代表Function指向这个常量? ruan18278816371 发表于 2014-7-10 23:24
那么这儿Function(常量),这样是代表Function指向这个常量?
汇编里面:
定义一个函数,假设地址在0x0100处。
XXX表示汇编代码
0x0100 : XXX
XXX
XXX
C里面
(Function)(0x0100) ,编译器会生成跳转语句,跳转到0x0100处执行。实际情况中,会根据你强制转换的函数的类型,如是否带形参。以及编译器对形参的传递是采用栈还是寄存器等方式,生成额外的一些汇编代码。
但最终一定会有一条跳转语句,跳转到0x0100处执行。
你有没有汇编语言的学习经历?学习下,对于理解C会更上层楼。
mcu_lover 发表于 2014-7-11 00:36
汇编里面:
定义一个函数,假设地址在0x0100处。
ORG伪指令? mcu_lover 发表于 2014-7-11 00:36
汇编里面:
定义一个函数,假设地址在0x0100处。
就在微机教材上见过汇编,不懂汇编{:sad:}
页:
[1]