define typedef的区别以及常量的定义
来源:互联网 发布:淘宝网下载2016新版本 编辑:程序博客网 时间:2024/06/06 13:20
typedef用法
1、
typedef
此声明定义了一个
size
例如:
Line
相当于char
typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。typedef看起来复杂根本原因是对象定义的语法比较复杂,例如分隔符*和[]的用法。typedef struct node{datatype data;struct node *lchild,*rchild;}bintnode;对应的对象定义:struct node{datatype data;struct node *lchild,*rchild;}bintnode;去除bintnode来看就是一个类型struct node的完整描述。加上了bintnode来看,表示定义了一个struct node类型的对象bintnode。现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么struct可以省略,struct node等价于node)。更复杂一点的:struct node{datatype data;struct node *lchild,*rchild;}bintnode, *bintree;注意定义对象时*修饰对象本身而不是修饰类型。因此这里定义了struct node对象bintnode和struct node*类型的对象bintree。对应的类型定义:struct node{datatype data;struct node *lchild,*rchild;}bintnode, *bintree;这里定义了类型别名bintnode表示完整类型struct node,以及bintree表示类型struct node*。拆开来就成了typedef struct node{datatype data;struct node *lchild,*rchild;}bintnode;typedef bintnode *bintree;这种写法看起来应该稍微清楚了一点。至于下面的cirqueue,和上面的bintnode类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略struct(C++里面不这样写也可以省略)。
Typedef和define都可以用来给对象定义另外一个别名,但是两者却有着很大不同。
1.
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d
}
程序的输出结果是: 36,根本原因就在于#define只是简单的字符串替换。
2.
Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。
如: typedef int (*PF) (const char *, const char *);
定义一个指向函数的指针的数据类型PF,其中函数返回值为int,参数为const char *。
typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:typedef long double REAL;
在不支持 long double 的机器上,该 typedef 看起来会是下面这样:typedef double REAL;
并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:typedef float REAL;
#include
typedef int arr[10];
void main()
{
}
#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
3.
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
void
4.
二者修饰指针类型时,作用不同。
Typedef int * pint;
#define PINT int *
Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;
Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;
pint s1, s2; //s1和s2都是int型指针
PINT s3, s4; //相当于int * s3,s4;只有一个是指针。
typedef的四个用途和两个陷阱
用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char*
//
以下则可行:
typedef
PCHAR
虽然:
char
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
用途二:
用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:
struct
{
};
struct
而在C++中,则可以直接写:结构名
tagPOINT1
估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef
{
}POINT;
POINT
或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫
typedef
在不支持