免费主题网站,长安镇网站建设,青海西宁制作网站公司,一站式 wordpresstypedef是一个我们常常会用到的关键字#xff0c;而这个关键字有许多陷阱或者说许多不为我们深入理解的地方。很多书上都是很简单地一笔代过#xff0c;并没有真正地让我们理解这个关键字。本文对其进行详细地说明。综合网络上找到的资料对其进行分析#xff0c;这其中会涉及…typedef是一个我们常常会用到的关键字而这个关键字有许多陷阱或者说许多不为我们深入理解的地方。很多书上都是很简单地一笔代过并没有真正地让我们理解这个关键字。本文对其进行详细地说明。综合网络上找到的资料对其进行分析这其中会涉及到一些其他c方面的内容(比如指针指向函数的指针编译时候数据类型未定义与完全定义知识等等)看到这些内容的时候大家可以忽略这个重点是在typedef。好了不说那么多开始吧。nbsp;h4typedef的定义/h4nbsp;typedef 是一个关键字后面是数据类型和标识符。标识符或类型名并没有引入新的类型而只是现有数据类型的同义词。它用来对一个类型起一个新名字也用来声明自定义数据类型其实给一个类型起新名字的作用也包含在声明自定义数据类型这个功能中。 1.给一个类型起一个新名字 给一个类型其新名字有时候可以帮助我们更好地记忆。 例子 pre langc escapedtruetypedef int inter/pre 此声明定义了一个 int 的同义字名字为 inter。注意 在这里typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 inter即可以用inter来代替int进行整数变量的定义。 这个功能是最常用的而且相对来说是比较简单的。 2.定义新的类型 定义新的类型有多种形式下面简单的列一些。 pre langc escapedtruetypedef BaseType NewType [arrSize]/pre 这种类型可以掩饰一些符合类型其中BaseType是基本类型NewType是我们所定义的新类型这个新定义的NewType可以像其他的基本类型那样使用。下面举个例子 pre langc escapedtruetypedef char Array[10]; /pre 这里的char就是基本的类型而Array是我们新定义的类型。这里Array是一个字符型的数组类型这个数组类型的长度为10。下面我们就可以用Array来进行一些定义了。 pre langc escapedtrue Array array1array2/pre 这里我就定义了两个Array型的数组这两个数组都是字符型的有10个元素的数组如果我们没有用typedef定义那么我么就要进行下面这样的定义 pre langc escapedtrue char array1[10];char array2[10]。/pre 这种形式可以应用到指针等。 这里引入typedef一个陷阱 pre langc escapedtrue typedef char * pstr; int mystrcmp(pstr, pstr); /pre 我们知道标准函数 strcmp()有两个const char *类型的参数。因此它可能会误导人们象下面这样声明 mystrcmp() pre langc escapedtrue int mystrcmp(const pstr, const pstr); /pre 用GNU的gcc和g编译器是会出现警告的按照顺序,const pstr被解释为char* const一个指向 char 的常量指针两者表达的并非同一意思。应该按以下方式定义 pre langc escapedtrue typedef const char* pstr; /pre 函数类型的形式 pre langc escapedtruetypedef int (*PF) (const char *, const char *)/pre 这种类似的形式 这个声明引入了 PF 类型作为函数指针的同义字该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。这种定义的用途过会在下面以例子的形式给出。 typedef 就像 autoexternmutablestatic和 register 一样是一个存储类关键字。这并不是说 typedef 会真正影响对象的存储特性它只是说在语句构成上typedef 声明看起来象 staticextern 等类型的变量声明。这一点对于我们理解typedef定义新类型的功能很有用。 这里引入typedef另外一个陷阱 pre langc escapedtrue typedef register int FAST_COUNTER; /pre 编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置在 typedef 声明中不能用 register或任何其它存储类关键字。 3.typedef与结构体结合使用 pre langc escapedtrue struct var { int data1; int data2; char data3; }; /pre 这里定义一个类型var而要定义这种类型的变量必须这样写struct var a;若添加typedef struct var newtype则定义变量只需这样即可newtype a typedef和结构体一般不这样使用而是按下面这样子 pre langc escapedtrue typedef struct var { int data1; int data2; char data3; } newtype; newtype a /pre 在链表中更一般的形式 pre langc escapedtrue typedef struct tagNode { char *pItem; struct tagNode *pNext; //这里不能写为*pNode *pNext } *pNode; /pre pre langc escapedtrue或者 typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; }; /pre typedef 有另外一个重要的用途那就是定义机器无关的类型例如你可以定义一个叫 REAL 的浮点类型在目标机器上它可以获得最高的精度 pre langc escapedtruetypedef long double REAL; /pre 在不支持 long double 的机器上该 typedef 看起来会是下面这样 pre langc escapedtruetypedef double REAL; /pre 并且在连 double 都不支持的机器上该 typedef 看起来会是这样 pre langc escapedtrue typedef float REAL; /pre 4.linux内核中typedef的例子 pre langc escapedtruetypedef int (*PF) (const char *, const char *) /pre 前面提到的这种类似的形式是可以简化函数的而且便于理解。举linux内核中信号处理函数这个例子 pre langc escapedtrue void (*signal (int signr,void (*handler)(int))) (int) /pre 其用typedef定义如下 pre langc escapedtrue typedef void sigfunc(int); sigfunc *signal(int signr,sigfunc *handler); /pre 其中typedef定义了一个有一个整型参数无返回值的函数类型。void (*handler)(int)表示一个有一个整型参数无返回值的函数指针这个指针名为handler所以其可以用sigfunc进行说明此时sigfunc就相当于前面的int signr中int的作用同理这个函数也是这样。 注对复杂变量建立一个类型别名的方法很简单你只要在传统的变量声明表达式里用类型名替代变量名然后把关键字typedef加在该语句的开头就行了。 pre langc escapedtrue int *(*a[5])(int, char*); //pFun是我们建的一个类型别名 typedef int *(*pFun)(int, char*); //使用定义的新类型来声明对象等价于int* (*a[5])(int, char*); pFun a[5]; /pre转载于:https://www.cnblogs.com/liweilijie/p/4984199.html