C++ typedef

要想理解typedef,最好先介绍一下函数指针

函数指针

原名叫function pointer,听上去名字挺吓人,其实很简单,跟其他数据类型的写法差不多,函数指针也是一个指针,只不过类型有点特殊而已。这里只需要记住它的写法就可以了:

// 声明一个void类型的函数,没有参数
void func();
// 声明一个void类型的函数指针,没有参数
void (*fun_ptr)():   //仅仅是前面加个*而已

// 定义该函数
void func(){
 cout << 1 << endl;
 }
// 定义该函数指针
func_ptr = &func;

如果func里面有参数也是一样的,无非声明的时候改成:

void func(int);
void (*fun_ptr)(int);
// 其他的都一样

C/C++的关键字typedef

简单的别名操作
C++的typedef可以实现别名操作,如下所示

// 创建名为uint和uchar的别名
typedef unsigned int uint;
typedef unsigned char uchar;

uint a; // 等同于unsigned int a;
uchar b;

typedef用于类或结构体
C语言里经常看到typedef用于Struct类型,而C++里要少见一些,在C++里,下面几种写法几乎没有区别:

struct S1
{
    int x;
};

struct 
{
    int x;
}typedef S2;

typedef struct
{
    int x;
}S3;

typedef用于泛型指针

对于下述声明typedef void* key_type;,key_type实际上是一个没有类型的指针(或者说叫泛型指针),这个指针可以隐式的转换成任何其他类型的指针,对于用户来说,这个key_type就好像一个句柄,用户并不知道具体是怎么实现的,同时也提高了易用性,因为如果都叫void*类型,那么用户完全不知道在调用哪一个模块的指针。(it’s a mechanism of hiding the inner workings of a library from its users, to improve modularity.)

typedef用于函数指针

void* (*AllocMem)(size_t size); // 声明一个指针函数,其返回类型是一个无类型指针,输入参数为size_t

正常如果使用这个函数指针,大概是这么用:

  // 声明函数指针
    void* (*func_ptr)(size_t t);

    // 声明函数
    void* func(size_t t) 
    {
        return nullptr;
    }

    int printHello()
    {
        // 对该函数指针进行赋值
        func_ptr = &func;
        // 调用函数
        auto a = func_ptr(3);
        ...
    }

OK,这样写我们就可以顺利生成对应的指针函数,为了提高熟练度,我们可以多创建一个此类型的函数指针,代码如下:

  // 声明四个指针函数,类型完全相同
    void* (*func_ptr1)(size_t t);
    void* (*func_ptr2)(size_t t);
    void* (*func_ptr3)(size_t t);
    void* (*func_ptr4)(size_t t);

    void* func(size_t t) 
    {
        return nullptr;
    }

    int printHello()
    {
        func_ptr1 = &func;
        func_ptr2 = &func;
        func_ptr3 = &func;
        func_ptr4 = &func;
    }

可以看到,上面这个写法有点麻烦,因为每个void* (*func_ptr1)(size_t t),参数和返回值都是完全一样的,这个时候,我们就可以在前面加上关键字typedef来进行简化,具体代码如下:

  typedef void* (*func_ptr)(size_t t);

    void* func(size_t t) 
    {
        return nullptr;
    }

    int printHello()
    {
        // 通过定义func_ptr这个别名,来简化生成函数指针的操作
        func_ptr func_ptr1 = &func;
        func_ptr func_ptr2 = &func;
        func_ptr func_ptr3 = &func;
        func_ptr func_ptr4 = &func;
    }

原文链接: https://www.cnblogs.com/hwx0000/p/14146853.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ typedef

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/354349

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午8:31
下一篇 2023年3月2日 上午8:32

相关推荐