现在的位置: 首页 > 综合 > 正文

浅析typedef关键字

2013年12月02日 ⁄ 综合 ⁄ 共 1819字 ⁄ 字号 评论关闭
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 在此表示感谢


抱歉!评论已关闭.