【C++】 关于 typedef void(* F)(int) 的解析
< 虽然C++11提供了更好用的 using 关键字,但是 typedef 仍然到处都是 --鲁迅 >
引入:
C语言允许用户使用 typedef 关键字 为类型 定义自己喜欢的名称,例如:
typedef int I; // 让 int 改名叫 I I variable = 1128;
推导:
为 int类型 定义一个函数名 Func(), 其返回值是int:
int test() { cout<<"成功调用!"; return 0; } int main() { typedef int Func(); Func* fptr = test; // 用此名称创建一个指针fptr,指向test()函数 fptr(); }
如果是需要调用的函数是void型:
void test() { cout<<"成功调用!"; } int main() { typedef void Func(); Func* fptr = test; fptr(); }
如果待调函数还有 输入参数:
void test(int parameter) { cout<<"成功调用!"; } int main() { typedef void Func(int); Func* fptr = test; fptr(1128); }
每次调用的时候都需要我们手动定义一个指针 fptr,比较麻烦,所以我们在定义的时候就:
typedef void (*Func)(int); //就像声明函数的时候 void Func(int param); Func fptr = test; fptr(1128);
于是:
一个函数指针就形成了
总结:
在 typedef void(* F)(int) 中, F是一个类, 这个类创造的对象是一个 可以指向 void function_name(int param) 的指针, 当我们需要很多不同的指针来调用函数时, typedef可以帮助我们简化代码
如果只需要一个函数指针:
void (*fptr)(int);
像声明函数一样声明它就可以了。
用处 :
// xv6的syscall static int (*syscalls[])(void) = { [SYS_fork] sys_fork, [SYS_exit] sys_exit, [SYS_wait] sys_wait, [SYS_pipe] sys_pipe, [SYS_read] sys_read, [SYS_kill] sys_kill, [SYS_exec] sys_exec, ...... };
syscalls就是一个 由函数指针构成的数组(其中SYS_fork = 1, SYS_exit = 2 ... 指明这个数组的第二个为sys_exit)
int (*syscalls[])() 很像函数的格式, 你可以把它看作"int *sys_fork(), int *sys_exit()..."这些函数指针的集合, *syscalls[]用来储存这些函数的地址
当你需要时就从*syscalls[]里取出, 比如我需要fork当前进程, 可以这样 :
int spid = syscalls[SYS_fork]();
延申:
既然我们能为int取一个函数名,那么是不是也可以取一个 数组名 呢?
typedef int Arr[10];
这个时候,Arr相当于一个int[10]的数组类型,我们定义这样一个数组便更简单了:
Arr arr = {0};
arr[0] = 1;
arr[1] = 1;
arr[2] = 2;
arr[3] = 8;
for(int i = 0; i<10; i++) {
cout<<arr[i]<<" ";
}
// 输出 1 1 2 8
私货:
但我个人更喜欢 using,更贴合c++的风格,看起来也似乎优雅一些:
using Func = void (*) (int); //右边依次为: 返回值类型 fptr类型 传入参数类型
//有点像声明函数的时候 void fptr (int param); Func fptr = test; fptr(1128);

浙公网安备 33010602011771号