typedef和#define

x33g5p2x  于2021-11-22 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(133)

typedef是c语言中一个重要的关键字其作用是为一种数据类型定义了一个新的名字这里的类型包括(int,char,double 等)和自定义数据类型,通俗一点来说就是为一种数据类型起一个别名

举个例子:

定义一个整型变量a并将其初始化为666,在将a的值输出

#include<stdio.h>
int main()
{
	int a = 666;
	printf("%d", a);
	return 0;
}

如果我想要用datatype代表int 了?也就是我想给int起一个别名这时候我们就可以使用c语言中的关键字typedef了

#include<stdio.h>
typedef int datatype;//注意末尾有分号
int main()
{
	datatype a = 666;
	printf("%d", a);
	return 0;
}

在这里小伙伴吗可能就会说了我用#define也可以

#include<stdio.h>
#define datatype int 
int main()
{
	datatype a = 666;
	printf("%d", a);
	return 0;
}

我们可以发现运行结果时一样的,那到底typedef 和#define有什么区别了。下面我们在看一个例子

#include<stdio.h>
#define ptr1 int *

int main()
{
	int a = 0;
	int b = 1;
	ptr1 c, d;
	c = &a;
	d = &b;

}

很多小伙伴可能认为这个代码没有什么问题但实际上这个代码是有问题的

我们可以看到编译器 报了一个警告这是为什么了。这是因为宏是在预编译期间完成文本替换。ptr1 c,d就相当于int*c,d;这时候d他就是一个整型

但我们在后面把一个整型变量的地址给了一个整型变量。类型不兼容所以编译器才会报了一个警告

那如果我们使用typedef了

我们可以看到编译器连警告都没有了。这是为什么了,这是因为typedef定义了新的数据类型ptr1.

ptr c,d就相当于int *c,*d;

下面我们再来看几个例子:

#include<stdio.h>
typedef int* ptr1;
#define ptr2 int *
int main()
{
	ptr1 a, b;
	ptr2 c, d;

}

a,b,c,d之中有几个不是指针类型了:相信大家只要看懂了上面的那一个代码马上就知道只有一个不是指针类型那就是d

在上述变量中a,b,c都被定义为int类型而只有d是int类型,这是因为#define只是做了简单的字符串替换,替换之后就相当于intc,d;

而typedef 是定义了新的数据类型ptr a,b就相当于int*a,*b;

下面我们在来看一个例子:(有点小坑)

#include<stdio.h>
typedef char* ptr1;
#define ptr2 char*
int main()
{
	char str[5] = "afff";
	const ptr1 s1 = str;
	const ptr2 s2 = str;
	s1++;
	s2++;

}

以上代码有什么问题了?如果是第一次看到的可以自己思考一下这段代码有什么问题

我们会发现编译器报错了可能有很多小伙伴,有点怀疑是不是编译器错了。编译器为什么会报错了。我们会发现编译器说第九行错了。这是为什么了

这是因为 s1为只读常量。这也在一次提醒我们typedef和#define是不同的。typedef并不是简单的文本替换上述的const ptr1 s1=str并不等价于const char *s1=str;而是等价于char const s1=str,在这里ptr1是作为一个类型存在的.所以const修饰的是s1对s1进行只读限制所以const ptr1 s1的含义是:限定数据类型为char的变量s1为只读,所以s1++或报错

总结:

#define 和typedef的区别
#define在预编译期间进行简单的字符串替换。#define的宏定义可以使用#ifdef .#ifndef等进行逻辑判断还可以用#undef取消定义

typedef是为一个类型取一个新的名字,使用typedef定义的变量,其作用范围限制在所定义的函数或者文件内(取决于定义的位置)而宏没有这种特性通常typedef要比#define要好特别是在指针里面

typedef的用途:

1.减少错误

2.直观简洁

3.平台无关性

4.掩饰复合类型

5.代码简化

6.typedef和存储关键字

7.定义指针类型

如果觉得不错的小伙伴可以点个赞!

相关文章

微信公众号

最新文章

更多