C语言基础-define和typedef

参考:http://c.biancheng.net/view/298.html
http://www.cnblogs.com/a1982467767/p/8889306.html

typedef:
C语言允许用户用typedef关键字来定义自己习惯的数据类型名称,以此来替代系统默认的(基本类型名称, 数组类型名称, 指针类型名称, 用户自定义的结构型名称, 共用型名称, 枚举型名称等.)
当用户定义了自己的数据类型名称后,程序中就可以使用该名称来定义变量的类型, 数组的类型, 指针变量的类型, 函数的类型等.

4种用法:

1.为基本数据类型定义新的类型名
在跨平台移植程序时,只需要改一下typedef的定义即可.
2.自定义数据类型(结构体, 共用体,枚举类型)定义简洁的类型名称
以结构体为例,下面我们定义一个名为 Point 的结构体:

struct Point
{
    double x;
    double y;
    double z;
};

在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:

struct Point oPoint1={100,100,0};
struct Point oPoint2;

在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。现在,我们利用 typedef 定义这个结构体,如下面的代码所示:

typedef struct tagPoint
{
    double x;
    double y;
    double z;
} Point;

在上面的代码中,实际上完成了两个操作:
(1)、定义了一个新的结构类型,代码如下所示:

struct tagPoint
{
    double x;
    double y;
    double z;
} ;

其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。
(2)、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:

typedef struct tagPoint Point

因此,现在你就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:

Point oPoint1={100,100,0};
Point oPoint2;

为了加深对 typedef 的理解,我们再来看一个结构体例子,如下面的代码所示:

typedef struct tagNode
{
    char *pItem;
    pNode pNext;
} *pNode;

从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?

其实问题并非在于 struct 定义的本身,大家应该都知道,C 语言是允许在结构中包含指向它自己的指针的,我们可以在建立链表等数据结构的实现上看到很多这类例子。那问题在哪里呢?其实,根本问题还是在于 typedef 的应用。

在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:

typedef struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
} *pNode;

或者将 struct 与 typedef 分开定义,如下面的代码所示:

typedef struct tagNode *pNode;
struct tagNode
{
    char *pItem;
    pNode pNext;
};

在上面的代码中,我们同样使用 typedef 给一个还未完全声明的类型 tagNode 起了一个新别名。不过,虽然 C 语言编译器完全支持这种做法,但不推荐这样做。建议还是使用如下规范定义方法:

struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
};
typedef struct tagNode *pNode;   

3.为数组定义简洁的类型名称
4.为指针定义简洁的名称

define
1,最简单的定义:
简单的文本替换

2.对函数进行定义

#define MAX(a,b) ((a)>(b)?(a):(b))

类似于这种形式的定义,但要注意运算符优先级问题.

3.对指针的操作与typedef不同:

#define pin int *
pin a,b;

实际是int *a, b

typedef pin int *;
pin a,b;

实际是int *a,int *b

两者的区别:
(1)用法不同
(2)执行时间不同
typedef是编译过程的一部分,define时预编译的部分
(3)作用域不同
typedef有作用域限制,define无限制
(4)对指针的操作不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值