typedef意义,用法与常见失误

1.typedef的意义


typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。
它有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法 。使用typedef可编写出更加美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性以及未来的可维护性。本文下面将竭尽全力来揭示typedef强大功能以及如何避免一些常见的使用陷阱。

2.常见用法


1)定义数组:
例如,你不用像下面这样重复定义有 81 个字符元素的数组
char line[81];
char text[81];
定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:
typedef char Line[81];
此时Line类型即代表了具有81个元素的字符数组,使用方法如下:
Line text, secondline;
getline(text);
2)定义指针
typedef char * pstr;
int mystrcmp(pstr, pstr);
3)定义复杂变量
typedef & 复杂的变量声明
编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
在linux内核中,此种使用非常常见:
1183 typedef int (*find_inode_t)(struct inode *, unsigned long, void *);
562 static struct inode * find_inode(struct super_block * sb, unsigned long ino, struct list_head *head, find_inode_t find_actor, void *opaque) 
 563 {
 564         struct list_head *tmp;
 565         struct inode * inode; 
 566 
 567         tmp = head;
 568         for (;;) {
 569                 tmp = tmp->next;
 570                 inode = NULL;
 571                 if (tmp == head)
 572                         break;
 573                 inode = list_entry(tmp, struct inode, i_hash);
 574                 if (inode->i_ino != ino)
 575                         continue;
 576                 if (inode->i_sb != sb)
 577                         continue;
 578                 if (find_actor && !find_actor(inode, ino, opaque))
 579                         continue;
 580                 break;
 581         }
 582         return inode;
 583 }


3.使用误区


1)结构体未定义先引用
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
         问题:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决方法:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
3)、规范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;

2)与#define的比较
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
typedef char* pStr;
#define pStr char*;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。

本文来源:谁不小心的csdn博客: typedef的意义,用法与常见失误
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
typedef是C语言中的一个关键字,用来为已存在的数据类型创建一个新的类型名。常见用法有以下几种: 1. 为基本数据类型取别名:可以使用typedef为基本数据类型(如int、char、float等)创建新的类型名,方便程序员使用。例如: typedef int myInt; 这样就将int类型取了一个别名myInt,以后可以使用myInt代替int进行变量的声明和定义。 2. 为复合数据类型取别名:通过typedef还可以为结构体、联合体或枚举类型创建新的类型名。例如: typedef struct { int x; int y; } Point; 这样就创建了一个名为Point的新类型,以后可以直接使用Point进行结构体变量的声明和定义。 3. 为指针类型取别名:可以使用typedef为指针类型创建新的类型名,方便程序员使用指针变量。例如: typedef int* IntPtr; 这样就创建了一个名为IntPtr的新类型,以后可以使用IntPtr进行指针变量的声明和定义。 4. 为函数指针类型取别名:可以使用typedef为函数指针类型创建新的类型名,方便程序员使用函数指针变量。例如: typedef int (*MathFunc)(int, int); 这样就创建了一个名为MathFunc的新类型,以后可以使用MathFunc进行函数指针变量的声明和定义。 注意:typedef只是为已有的类型创建了一个新的类型名,并没有创建新的数据类型。因此,只是提供了一种更方便的方式来使用已有的类型,不会产生新的数据类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值