typedef最常用也最好理解的是当作类型的别名,例如:
tepedef unsigned int UINT;
UNIT i = 10;
这样很好理解,number是int的一个别名,及代表int的一个类型说明符。所以第二语句很自然的就可理解为将i定义为一个unsigned int型变量,并且赋值为10。但一开始我们使用typedef时,很容易将它与define相混淆,认为它的功能差不多也是文本替换而已,但是如果这样理解的话,下面的一个语句就不好解释了:
typedef string *name;
name xiaohong;
如果按上述理解的话使用*name来代替string,使用时也应该是*name xiaohong;才对。但是这样理解是不对的,上面的语句等同于:
string *xiaohong;
是将xiaohong定义一个指向字符串的指针。
所以typedef远远不止这么简单,它的功能也不能用一个文本替换来概括。下面我们来看看它的一些更复杂的功能:
typedef string *name;
const name xiaohong;
按现在的理解,xiaohong应该是个什么类型的变量呢?也许你会认为这个相当于:
const string* xiaohong;
其实不是这样的。正确的应该是:
string *const xiaohong;
xiaohong是一个指向string类型的const指针。
typedef与多维数组指针定义:
int a[4][3];
int (*b)[3]=a[0];
上面语句将b声明为一个指向含有3个整型元素的数组的指针,具体点说就是b的类型是int[3]*而不是int*。如果我们用typedef来简化定义,我们可以这样写:
int a[4][3];
typedef int array[3];
array *b;
b=a[0];
上面的语句也是将b声明为int[3]型指针。对于这个语句,我是这样理解的typedef int array[3];相当于声明一个链接,它将用标识符array声明的变量名b链接到定义标识符array的typedef语句里去,如果我们用公式array=*b代入typedef的话就可以得到:
int (*b)[3];
其实我发现这样代入能够使我们很容易的去理解一些比较复杂的typedef语句,操作简单明了,一看便懂。例如下面的一个函数声明:
int (*func)(const int&,const string&);
我们可以使用typedef来简化上面的函数声明:
typedef int (*func_easy)(const int&,const string&);
func_easy func;
这语句的功能等同于int (*func)(const int&,const string&);对于这个函数声明同样可以用链接的方式进行理解。
阅读(221) | 评论(0) | 转发(0) |