typedef

刚学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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值