C++ の typedef

关于typedef

这个纯纯是截取优秀的评论区 自己summary🤔

记得大一听到这段昏昏欲睡😪

特此复习咯~👌

您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:

typedef type newname; 

例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:

typedef int feet;

现在,下面的声明是完全合法的,它创建了一个整型变量 distance:

feet distance;

typedef的一些优点 :

​ 可以用 typedef 来定义与平台无关的类型。

​ 比如定义一个叫 FALSE 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double FALSE; 

在不支持 long double 的平台二上,改为:

typedef double FALSE; 

在连 double 都不支持的平台三上,改为:

typedef float FALSE; c

也就是说,当跨平台时,只要改下typedef本身就行,不用对其他源码做任何修改

标准库就广泛使用了这个技巧,比如 size_t

typedef的一些缺点 :

//可以使用 typedef 为类型添加別名:
typedef int Int;
//	当然,也可以使用 using:
using Int=int;

可以看到,第二种可读性更高。

另外,using 在模板环境中会更加强大。

假设有一个模板参数是 int的类 grid,那么可以这么做:

using grid1=grid<1>;

那要声明一个指向返回 void,有一个 int 参数的函数的函数指针呢 ?

或许可以使用typedef

typedef void(*f1)(int);

可以看到,可读性很低,那使用 using 呢?

using f1=void(*)(int);

使用using 明显更好理解:所以,始终优先使用 using

那如果将函数指针作参数呢?

void func(void(*f1)(int)){
//...
}

这无法使用 using 完成。

但是,使用 <functional> 中的function 可以更好地完成任务:

void func(function<void(int)>f1){
//...
}

所以,尽量不去使用 typedef

typedef#define的区别 :

  1. 执行时间不同

    • 关键字 typedef 在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能

    • #define 则是宏定义 发生在预处理阶段,在是编译之前,它只进行简单而机械的字符串替换,不进行任何检查

  2. 功能有差异

    • typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等
    • #define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
  3. 作用域不同

  • #define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用
  • typedef 有自己的作用域
  1. 对指针的操作

    二者修饰指针类型时,作用不同

    typedef int * pint;
    #define PINT int *
     
    int i1 = 1, i2 = 2;
     
    const pint p1 = &i1;    //p不可更改,p指向的内容可以更改,相当于 int * const p;
    const PINT p2 = &i2;    //p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;
     
    pint s1, s2;    //s1和s2都是int型指针
    PINT s3, s4;    //相当于int * s3,s4;只有一个是指针。
    

posted on 2022-05-13 20:46  AcherLoveCode  阅读(29)  评论(0编辑  收藏  举报

导航