#define 、const 、typedef 诠释

1,符号亮量、预处理指令

#define   PI   3.1416       //注意行末没有分号

在对程序进行编译前,预处理器先对PI进行处理,把所有的PI全部置换为3.1416。

        #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

        注意:要区分符号常量和变量,符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋予新值,习惯上符号常量一般用大写,如PI,PRICE等。

 

2,常变量

const  float  pi=3.1416;         //行末有分号

常变量具有变量的基本属性,有类型,占存储空间,只是不允许改变其值。

 

3,关键字

typedef unsigned int UINT;         //行末有分号

这以后就可用UINT来代替int作整型变量的类型说明了,如: 
UINT a,b;

typedef struct

 {  

      int data;

      struct node *Lchild; 

      struct node *Rchild;            

}BiTNode, BiTree *;                 //行末有分号

可以用新的类型名BiTNode,BiTree去定义变量:

BiTNode structNode;  // 定义结构体类型structNode,不要写成struct BiTNode structNode;

简化一些比较复杂的类型声明。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

 

4, #define 和 typedef 的区别

#define是C中定义的语法,typedef是C++中定义的语法,二者在C++中可以通用,但#define成了预编译指令,typedef当成语句处理。Typedef和#define都可以用来给对象取一个别名,但是两者却有着很大不同。

#define INTPTR1 int*

typedef int* INTPTR2;

INTPTR1 p1, p2;

INTPTR2 p3, p4;

含义分别为,

声明一个指针变量p1和一个整型变量p2

声明两个指针变量p3、p4

 

1,二者执行时间不同:

  • 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
//define用法例子: 
#define f(x)  x * x  
int main( )  
{  
    int a=6,b=2,c;  
    c=f(a) / f(b);//6 * 6 / 2 * 2;  
    printf("%d \n",c);
    return 0;  
} 
  • 程序的输出结果是::36,其根本原因就在于#define只是简单的字符串替换,若想要得到我们所期待的结果应当加个括号“(X*X)”。
  • #define f(x) (x * x) //这样计算的结果就为我们所期待的9。
  •  

 

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; 
  • #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

 

3,作用域不同:

  • #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
void fun()   
{   
    #define A1 int
    typedef int A2;   
}  

void gun()   
{   
    A1 a,b; //在这里也可以使用A1,因为宏替换没有作用域,   
    //这里就不能用A2 ,不过一般不在函数内使用typedef  
} 

 

,4,对指针的操作:

  • 二者修饰指针类型时,作用不同。
Typedef int * pint;  
#define PINT int * 
int main()
{ 
    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;只有s3一个是指针。
}
  • 另外,typedef和define末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾稿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值