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

const与define的一点区别

程序员文章站 2022-03-07 16:00:55
...

观察下列两种写法有什么区别

 #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;
}

通过监视器不难看出

const与define的一点区别

我们定义的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指针所指对象,可变)
}
这里通过监视器以确认

const与define的一点区别

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也是存储类关键字,不允许两个一起用