刚学C的时候,觉得typedef不就是起个别名吗,现在想想哪有那么简单。
typedef的用法:
1、使用typedef为现有类型创建同义字、定义易于记忆的类型名
typedef int size;
void max(size number);
size array[4];
std::vector<size>vs;
2、typedef还可以掩饰复合类型,如数组和指针。
例如,你不用像下面这样重复定义81个字符元素数组:
char line[81];
char text[81];
只需像下面这样定义:
typedef char Line[81];
Line text, line;
getline(text);
同样可以像下面这样隐藏指针语法:
typedef char* pstr;
int mystrcmp(const pstr p1, const pstr p2);
上面的代码用GNU的gcc和g++编译器,是会出现警告的,按照顺序,’const pstr’被解释为’char * const’(一个指向char的指针常量),而事实上,我们想要的是一个常量指针(const char *)。
typedef使用时的需要注意的地方:
在编程中使用typedef的目的一般有两个,一个是给变量一个容易记忆且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
1、typedef & 结构体的问题
当用下面的代码定义一个如下的结构体时,编译器报错了,为什么呢???
我们知道结构体中是可以包含指向自己的指针的。
typedef struct tagNode {
char *pItem;
pNode pNext;
}*pNode
这是因为当编译到pNode pNext这一行时,它还不知道pNode是什么,也就是说,编译器不认识pNode。这也是为什么我们写链表的时候采用的是下面这种方式的原因:
typedef struct tagNode {
char *pItem;
struct tagNode* pNext;
}pNode
规范的做法如下:
typedef struct tagNode {
char *pItem;
struct tagNode* pNext;
};
typedef struct tagNode* pNode;
2、typedef & #define的不同
我们来看看下面的一段代码,那种定义方法更好,两者有什么不同吗?
typedef char* pStr;
#define pStr char*
一般来讲,typedef要比#define好,特别是在有指针的场合。看下面的例子:
typedef char* pStr;
#define pStr char*
pStr s1, s2; //equal to char *s1, *s2;
pSt2 s3, s4; //equal to char *s3, s4;
在上述的变量定义中,s1,s2,s3都是char*类型,但是s4却不是,而是char,不是我们所预想的指针变量,根本原因在于#define只是简单的字符串替换,而typedef则是为一个类型起新名字。再来看看下面的例子,如果你弄懂了typedef和define的不同,请想想代码错在了哪里。
#include <stdio.h>
#define f(x) x*x
int main(void)
{
int a=6, b=2, c;
c = f(a) / f(b);
printf("%d\n", c);
return 0;
}
程序的输出结果是:36,而不是9。这里的道理和上面的例子是一样的,第六行代码被预编译处理后等价于下面:
c = a*a/b*b;
所以C编程规范会要求,如果宏定义中包含表达式,必须使用括号,则上述定义应该如下才对:
#define f(x) ((x)*(x))