Linux内核之 “typedef int (init_fnc_t) (void);”
2013-06-30 00:41
555 查看
在C/C++编程中,
1)我们通常会见到如下 typedef的定义 :
2)对于函数我们通常会这样声明:
3)再看一个例子,如果调用函数:
对于函数((void (*)(int))0x00000020)(0x7fff4); //0x7fff4是传递的参数,(void (*)(int))0x00000020是函数名。
从上面我可以看出,其实函数名本身也就是一个地址,像上式中,如果你知道函数fun存储在地址0x0000 1234,理论上你可以这么写:0x0000 1234(5),当然实际上不能这么写,因为虽然fun在0x0000 1234地址,但是你编译器不知道这个函数的参数、返回值等信息,所以要强制转换一下。
接下来看一下怎么把一个地址转换成函数名:
如果把 char a ; 中的a转换成 int 形变量,要这样写:b = (int)a;
同样要把0x0000 0020地址转换为函数名,也要进行强制转换,只要在0x0000 0020的前面加上要转换的类型。
(void (*)(int))就是函数类型,跟void (*pfun) (int x); 声明一个函数指针是相对应的。
1)我们通常会见到如下 typedef的定义 :
typedef int MyInt; MyInt a;这个时候MyInt 和int是一样的类型,只是同一种类型不同叫法。
2)对于函数我们通常会这样声明:
int InitFunction(void); //此时表示声明了一个函数名为InitFunction的函数, 函数无形参,返回值类型为int型。 typedef int(init_fnc_t) (void); // 对一个 int (void)类型的函数取别名为init_fnc_t。 可以利用这个别名创建这个类型的函数对象。 init_fnc_t *MyFunction; //一个函数的指针。如果某个函数的类型和这个函数一样的,那么可以将这个函数的指针指向该函数。然后你就可以直接调用MyFunction();以下有个函数调用的例子,如下:
#include <stdio.h> int GetData(void) { return 101; } int main() { typedef int (init_fnc_t)(void); init_fnc_t *MyFunction; MyFunction = GetData; printf("%0x",MyFunction()); return 0; }这个时候打印出来的结果就是 0x0000 1001(假设的地址,不同的机器不一样)
3)再看一个例子,如果调用函数:
EnterPWDN(0x7fff4); //会被替换成:( (void (*)(int))0x00000020 )( 0x7fff4 );这个涉及到函数指针,函数指针的用法如下:
void fun(int x); /* 声明一个函数 */ void (*pfun) (int x); /* 声明一个函数指针 */ pfun = fun; /* 将func函数的首地址赋给指针f */那么调用函数fun可以这样调用:fun(5); 也可以这样调用:(*pfun)(5);
对于函数((void (*)(int))0x00000020)(0x7fff4); //0x7fff4是传递的参数,(void (*)(int))0x00000020是函数名。
从上面我可以看出,其实函数名本身也就是一个地址,像上式中,如果你知道函数fun存储在地址0x0000 1234,理论上你可以这么写:0x0000 1234(5),当然实际上不能这么写,因为虽然fun在0x0000 1234地址,但是你编译器不知道这个函数的参数、返回值等信息,所以要强制转换一下。
接下来看一下怎么把一个地址转换成函数名:
如果把 char a ; 中的a转换成 int 形变量,要这样写:b = (int)a;
同样要把0x0000 0020地址转换为函数名,也要进行强制转换,只要在0x0000 0020的前面加上要转换的类型。
(void (*)(int))就是函数类型,跟void (*pfun) (int x); 声明一个函数指针是相对应的。
相关文章推荐
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void)函数类型和函数指针的区别
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void)
- linux内核学习初笔记(3)u-boot执行第二阶段typedef int (init_fnc_t) (void)解释
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void);
- uboot中typedef int (init_fnc_t) (void);详解
- “typedef int (init_fnc_t) (void);“的含义
- typedef int (*init_fnc_t)(void);的理解
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void)
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void);
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void) 区别
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
- typedef int(init_fnc_t) (void)的解释
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
- 深入剖析u-boot代码typedef int (init_fnc_t) (void)
- OMAPL138学习---typedef int(init_fnc_t)(void)
- 自定义函数名数据类型typedef int (init_fnc_t) (void);
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void);