问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言type 与 #define 定义区别

发布网友 发布时间:2022-05-01 22:22

我来回答

5个回答

热心网友 时间:2022-06-24 07:30

#define仅仅是编译前期的预处理过程中进行源代码中的字符串替换,不参与之后的翻译期语法检查。
typedef定义的类型别名会被静态类型系统检查,如果发现了用未定义的类型来定义新的类型,会明确地产生编译错误。
此外,typedef的语法允许定义复杂的类型(和用这些类型定义这些类型的对象一致,只不过前面加typedef,定义的是类型名而不是对象名),例如
typedef struct node_
{
int dat;
struct node* next;
} node;
typedef int array_type[10];
typedef void(*func_ptr)(int);
由于预处理器和上述复杂类型的语法(语序)的*,#define无法简单地做到定义这些类型。
由于指针定义语法的特殊性,宏替换还有个陷阱,就是关于指针说明符的*,在定义时需要出现在每一个指针项上,而宏定义无法做到让一个宏记录类型信息,于是用这个类型定义对象时就可能产生错误:
#define INT_PTR int*
typedef int* int_ptr;/*说明指针类型的星号可以紧接int或int_ptr或两者,或都隔开若干空格,这里强调int*表示一整个类型。*/
INT_PTR a, b; /*展开后为 int* a, b;注意b是int,不是指针。*/
int_ptr c, d; /*c和d都是int*类型,即指向int的指针。*/
====
[原创回答团]

参考资料:原创

热心网友 时间:2022-06-24 07:30

#define仅仅是编译前期的预处理过程中进行源代码中的字符串替换,不参与之后的翻译期语法检查。
typedef定义的类型别名会被静态类型系统检查,如果发现了用未定义的类型来定义新的类型,会明确地产生编译错误。
此外,typedef的语法允许定义复杂的类型(和用这些类型定义这些类型的对象一致,只不过前面加typedef,定义的是类型名而不是对象名),例如
typedef struct node_
{
int dat;
struct node* next;
} node;
typedef int array_type[10];
typedef void(*func_ptr)(int);
由于预处理器和上述复杂类型的语法(语序)的*,#define无法简单地做到定义这些类型。
由于指针定义语法的特殊性,宏替换还有个陷阱,就是关于指针说明符的*,在定义时需要出现在每一个指针项上,而宏定义无法做到让一个宏记录类型信息,于是用这个类型定义对象时就可能产生错误:
#define INT_PTR int*
typedef int* int_ptr;/*说明指针类型的星号可以紧接int或int_ptr或两者,或都隔开若干空格,这里强调int*表示一整个类型。*/
INT_PTR a, b; /*展开后为 int* a, b;注意b是int,不是指针。*/
int_ptr c, d; /*c和d都是int*类型,即指向int的指针。*/
====

热心网友 时间:2022-06-24 07:30

typedef和宏它们针对的软件都不一样.
宏是预处理器的任务, 比如说:#define A 10, 预处理器在读取这行后, 它会把程序以后的所有大写字母A都替换成10(需要全字匹配). 我们写的代码必须通过预处理器处理后, 才会被编译器编译.

而typedef是针对的编译器, 不是预处理器的任务. 编译器读取typedef unsigned int UINT;后, 它会在以后的代码中, 认为UINT就是unsigned int, 也就是说对编译器来讲又多了一种数据类型, 但是这种数据类型和unsigned int是一样的.

热心网友 时间:2022-06-24 07:31

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
#define PIN1 int *
typedef (int *) PIN2;
从形式上看这两者相似, 但在实际使用中却不相同。
下面用PIN1,PIN2说明变量时就可以看出它们的区别:
PIN1 a,b;在宏代换后变成:
int *a,b;
表示a是指向整型的指针变量,而b是整型变量。
然而:
PIN2 a,b;
表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。

热心网友 时间:2022-06-24 07:32

typedef是创建一个别名

#define是宏~ 只是做文本替代作用.. 而且宏必定被执行,除非在宏上做判断
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
常德到龚滩多少公里 龚滩到武汉多少公里 一骑当千第一季(红旅告诉我哪个是就好)第二季是那个也告诉我第三季同 ... 一骑当千出第二季啦? 一骑当千第二季从哪看? 老余杭公园免费景点_余杭区还有什么地方好玩 现存明代大型铁、铜钟图文总汇 红米6pro手机内存只剩1G了,SD卡还有180G,有什么方法能把下载的文件弄... 红米手机如何连接电脑(红米手机如何连接电脑传文件) 大疆晓spark下载什么app操控 C语言 #define MAX (int)(((unsigned)(~((int)0)))>>1) C语言中 #define N 3 int [N][N]={1} 是不是说明a[0][0]=a[1][1]=a[2][2]=1啊? #define PRINT(int) printf(#int " = %d\n",int) m=1 PRINT(m) 输出:m=1 C语言define中的#号是什么意思 月经期可以吃柚子嘛,吃了会不会肚子疼 隔夜饭该怎么样才会没味道 请问有施工员顶岗实习日记或周记吗?总结报告,麻烦发到470144470@qq.com,请帮帮忙,谢谢! 暗度陈仓讲的是历史上哪位名人 明修栈道 暗度陈仓,出自哪个典故 明修暗道暗度陈仓是指的谁的故事 暗度陈仓的典故 求一篇施工员顶岗实习总结报告,要求5000字,必须有目录,有的说下,真心qiu, 暗度陈仓历史故事? 暗度陈仓出自哪个典故 “明修栈道”、“暗度陈仓”的典故说的是谁? 《暗渡陈仓》是什么的故事? 明修栈道和暗度陈仓,是韩信还是张良出的计谋? 什么是微店?? 明修栈道,暗度陈仓的历史典故和寓意 简述三国演义中诸葛亮暗度陈仓的故事 我看佛说阿弥陀经注音是amituo,无量寿经注音是emituo怎么回事呀? jpg格式图片怎么弄设置大小为1M EXCEL 左边是台账明细表,右边是每天汇总,计算每天汇总 怎么才能把JPG格式的图片转换成MBM的???、急求!!!1 台帐和清单有什么区别 鸡打鸣吉凶时辰 公鸡它是什么时候叫,几点叫一更,几点二更……啊! qq情侣头像知道一张配对另一张 一晚上有几更?每更各是几点? qq情侣头像双人头一张照片上男的露出半张脸女的也露出半张脸的 几更天鸡开始叫明 中国古代的几更天是怎么划分的 闻鸡起舞几更天?鸡一般是什么时候打鸣? 鸡打鸣一般在三更以后,如果在一、二更打鸣会有吉凶说法,鸡鸣时辰吉凶... 帮助客户伪造销售合同骗取银行贷款要承担法律责任吗? 用假购销合同骗取贷款是犯罪吗 老板以收水果的名誉诈骗银行5千万跑了我帮出具了虚假合同夸大了事实会承担什? 使用虚假判决文书骗取银行贷款算不算贷款诈骗罪 做假的买卖合同骗银行贷款,签字了会有什么后果? 犯罪分子诈骗骗取银行贷款判刑多少年 挑战杯创业大赛创业计划书封面怎么做