#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 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末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。
上一篇: 关于MFC中AfxGetApp函数是怎么得到全局对象的指针的简要分析
下一篇: epoll的两种模式