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
的区别 :
-
执行时间不同
-
关键字
typedef
在编译阶段有效,由于是在编译阶段,因此typedef
有类型检查的功能 -
#define
则是宏定义 发生在预处理阶段,在是编译之前,它只进行简单而机械的字符串替换,不进行任何检查
-
-
功能有差异
typedef
用来定义类型的别名,定义与平台无关的数据类型,与struct
的结合使用等#define
不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
-
作用域不同
#define
没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用- 而
typedef
有自己的作用域
-
对指针的操作
二者修饰指针类型时,作用不同
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) 编辑 收藏 举报