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 阅读(51) 评论(0) 收藏 举报
浙公网安备 33010602011771号