欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#define 、const 、typedef 诠释

程序员文章站 2024-03-23 11:45:16
...

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 node

 {  

      int data;

      struct node *Lchild; 

      struct node *Rchild;            

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

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

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末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

 

相关标签: C语言