typedef是一种给已有的数据类型以别名来简化定义的方法,简单记录一下自己的学习心得。
typedef int YourDefInt;
YourDefInt a;
上面就是定义的一个int,效果等同于下面的这个:
int a;
看起来好像还变麻烦了,实则——
好吧确实是变麻烦了,int三个字母变成YourDefInt是个字母可不是变麻烦了吗。
那为什么我们还需要这个呢?我们来一个复杂的定义:
int add(int a, int b)
{
return a + b;
}
int (*FuncPtr)(int, int);
FuncPtr = add;
print("%d", FuncPtr(3,5));
我们发现这里有个嗨长的定义,就是函数指针FuncPtr的定义。
ok我们如果要定义很多个这种玩意,我这种懒比肯定是不想全部手打的啊,回去找到这行代码复制粘贴一遍麻烦程度更是不如手打。
这个时候,typedef就排上用场了,他是干什么的来着?
对!给已有的数据类型以别名,可以简单而抽象地理解成定义定义或者定义声明,我们可以像下面这样写:
int add(int a, int b)
{
return a + b;
}
typedef int (*Funcdef)(int, int);
Funcdef FuncPtr;
FuncPtr = add;
print("%d", FuncPtr(3,5));
好像还是麻烦了,别着急,我们如果要定义很多个这种变量呢?
typedef char CDef[99];
CDef c1;
CDef c2;
...
CDef c99;
当然只是举个例子,但是在这个例子里你会发现,定义确实会简化一些。
说了这么多,怎么用这玩意呢?
假设我们有一个定义:
double x;
然后在前面加上typedef
typedef double x;
其实这个时候就已经对了,我们将x变为了double这个数据类型的别名。当然,这不太符合工程规范,我们改一下名字会比较好。
typedef double typedou;
typedou x;
这样才算是一个完整的定义过程,简单来说用法如下:
typedef %数据类型% %你希望的该类型的别名%;
%你希望的该类型的别名% %变量名%;
令人惊喜的是,由于typedef是给已有的数据类型一个别名,我们需要改动用它来定义的变量类型时,我们仅需要改动typedef语句就可以了,例如:
typedef char CDef[99];
CDef c1;
CDef c2;
...
CDef c99;
改为:
typedef char CDef[80][80];
CDef c1;
CDef c2;
...
CDef c99;
将上面的改成下面的仅需要改动一行,多么优雅的维护方式。
不过值得一提的是,它仅在定义域内生效,比如:
class MyClass {
public:
typedef int ClassInt;
ClassInt a; // 有效
};
MyClass::ClassInt c = 30; // 有效,因为使用了类的作用域
ClassInt d = 40; // 错误,ClassInt 在这里不可用
和函数,变量等一样,或许可以理解为一个存储数据类型的变量。