const与define的一点区别
观察下列两种写法有什么区别
#define PINT int *
typedef int * SINT;
首先我们有一个需要注意:
#define 宏常量是在预编译阶段进行简单替换。
对typedef而言,typedef 的真正意思是给一个已经存在的 数据类型(注意:是类型不是变量)取一个别
名,而非定义一个新的数据类型。
区别:
1、define只是简单的替换,将代码中有PINT的字样替换成int *,而typedef则是给类型 int * 起一个别名。
做如下实例:
#include <stdio.h>
#define PINT int *
typedef int * SINT;
void main()
{
PINT a,a2;
SINT b,b2;
}
通过监视器不难看出
我们定义的a是int*指针类型,而a则是int型,这就是define的简单替换,只是换掉PINT的位置换上int *,此时int *中*号跟第一个a结合在一起,而不是和int类型结合,所以编译器认定a是指针a2是整型变量。相信不能理解b与b2都是int *型,因为SINT代表的int *这个类型。从意义上两者是不同的。
2.
这里我们在用const在加深一下,看看const修饰情况。
#include <stdio.h>
#define PINT int *
typedef int * SINT;
void main()
{
const PINT a=0,a2=0;
//const修饰*a(a是指针可变,*a指针所指对象,不可变),修饰a2(int型变量)不可变
const SINT b=0,b2=0;
//const修饰b(b是指针不可变,*b指针所指对象,可变),修饰b2(b是指针不可变,*b2指针所指对象,可变)
PINT const c=0,c2=0;
//const修饰c(c是指针不可变,*c指针所指对象,可变),这里c2与const无关仅是int型变量而已。
SINT const d=0,d2=0;
//const修饰d(d是指针不可变,*d指针所指对象,可变),修饰d2(d2是指针不可变,*d2指针所指对象,可变)
}
这里通过监视器以确认
3、
a) #define INT int
unsigned INT i = 10;
b) typedef int It;
unsigned Int j = 10;
其中b) 编译出错,a)不会出错,因为在预编译的时候 INT被替换为 int.
而 unsigned Int i = 10;语句是正确的。但用 typedef 取的别名不支持这种类型扩展。
4、
另外 typedef static int INT是不行的typedef是存储类关键字static也是存储类关键字,不允许两个一起用
上一篇: 面试常问之JavaScript变量提升