【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);

 

posted @ 2022-08-10 15:09  HeHonbo  阅读(1020)  评论(0)    收藏  举报