typedef MSDN上的解释是:在一个已经定义的类型的作用域内,定义一个该类型的同义词语。
typedef type-declaration synonym;
与class、struct、union、enum相比,typedef关键字不会创建一个新的类型,仅仅是给一个已经存在的类型取一个新的名字。
不能将typedef关键字用于函数定义内(msdn用的cannot不是must not 虽然编译不会出错,最好还是不要用)。
typedef 命名的名字与原来名字共享namespace,因此在一个程序中,typedef命名的名字可以和一个本地变量命名的名字相同。由于“The name-hiding rules ”以下代码也是合法的:
// typedef_specifier1.cpp
typedef char FlagType;
int main() {
}
void myproc( int ) {
int FlagType;
}
关于typedef容易忽视的几个问题
1.当存在逗号时,给指针取名字别忘记给逗号后面的新名字加’*‘,例如:
typedef char *PCHAR,*PSTR;
上面这一行代码的作用将char*取了两个新名字:一个叫PCHAR,另一个叫PSTR。区分以下代码:
typedef char *PCHAR,PSTR;
上面这行代码作用是:给char*取个新名字叫PCHAR,给char取新名字叫PSTR。
2.名字的整体性。例如:
typedef char * PCHAR;
char a = '2';
const char *p1 = &a;
const PCHAR p2= &a;
p1++;
p2++;
编译时会报以下错误:
error C2166: l-value specifies const object
将PCHAR当做一个类型,去掉类型修饰符变成以下语句:
const *p1 = &a;
const p2= &a;
第一个const修饰的是’*‘,表示常量指针(指针指向一个常量),第二个const修饰的是变量p2,表示一个指针常量(指针本身是常量,指向一个变量)。
再看一个例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
以上代码中s1,s2,s3是char*,而s4是char。typedef具有整体性,而#define只是简单的字符串替换。
3.typedef是一个存储类修饰符
意味着typedef关键字和static,extern,register,auto互斥。例如以下代码:
typedef register int test_type;
编译时产生以下错误:
error C2159: more than one storage class specified
typedef的几种用法:
1.为复杂的类型定义一个简单的名称
例如定义一个文本缓冲区:
char text[255],line[255];
可以用typedef简写:
typedef char Txt[81];
Txt text,line;
2.定义跨平台的类型
例如在linux下不支持__int64,只支持long long int.;
typedef __int64 my64int;
将代码移植到linux只需要改成如下形式而不用修改其他代码
typedef long long int my64int;
3.简化函数指针(数组)
3.1例如以下代码:
int *(*pfArray[5])(int, char*);
简写成如下形式:
typedef int*(*pFun)(int,char*);
pFun pfArray[5];
3.2例如以下代码:
void (*array[10]) (void (*)());
简写成如下形式:
typedef void(*pFunParam)();
typedef void(*pFun)(pFunParam);
pFun pArray[10];
3.3例如以下代码:
doube(*)() (*pd)[9];
简写成如下形式:
typedef double(*pFun)();
typedef pFun(*pFunParam)[9];
pFunParam pfp;
4.纯C中修饰struct,例如:
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
本文参考:http://www.cnblogs.com/cxun/archive/2007/04/28/731455.html 在此表示感谢