网易首页 > 网易号 > 正文 申请入驻

C语言中宏定义都有那些盲区?

0
分享至


预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
首先定义一个宏

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

Road in Himalayas. Spiti Valley, Himachal Pradesh, India

1、概念

命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。

(1)简单的宏定义:

#define <宏名> <字符串>

#define VALUE ((sizeof(a)) /sizeof(a[0]))

(2) 带参数的宏定义 #define <宏名> (<参数表>) <宏体>

#define MAX(a,b) ((a)>(b)?(a):(b))

2、不能忽略宏定义中的空格

下面的宏定义中f是否带了参数呢?

#define f (x) ((x)+1)

答案是否定的,在f与(x)之间存在一个空格,导致变成了如下定义。

#define f (x)((x)+1)

3、宏不是函数

如果我们定义一个宏:

#define MAX(a,b) a>b?a:b

当我们执行一个语句:

3+MAX(1,3);

我们期望的答案应该是6才对,其实呢,运行之后的答案1。与宏定义相挂钩的就是优先级,算数运算符的优先级高于条件运算符,展开如下。

3+1>3?1:3,首先进行算符运算符的运算,即4>3?1:3,所以答案为1。

请注意宏定义中的括号,这些括号的作用就是预防引起优先级相关的问题。有些专家建议在C语言中只要牢记两个优先级就够了,乘除法优先级高于加减法,在设计其它操作符时,一律加上括号。

4、宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换

5、宏不是类型定义

#define pChar char*

再用pChar 定义两个变量,之后用操作符sizeof读取变量所占用内存大小,如果是指针类型的就占4个字节,如果是字符型的就占1个字节。

结果占用空间不一样,变量类型自然不一样,所以宏定义不是类型定义。那如果我换成typedef来定义类型呢?

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明。

6、与之相关的宏定义

编写程序过程中,很多都需要条件编译,来看一个常用的使用方法。

#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif

7、总结

宏的本质是代码替换。

  • 原文来自:https://mp.weixin.qq.com/s/UEDaDcgzJ8IdutsjQPOz5A
  • 本文地址:https://www.linuxprobe.com/c-language-macro-definition-blind-zone.html编辑:J+1,审核员:逄增宝
  • Linux命令大全:https://www.linuxcool.com/
  • Linux系统大全:https://www.linuxdown.com/
  • 红帽认证RHCE考试心得:https://www.rhce.net/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
有人从垃圾中发现RTX4090Ti原型 巨大的四插槽设计

有人从垃圾中发现RTX4090Ti原型 巨大的四插槽设计

3DM游戏
2024-11-27 10:31:53
欧洲准备与俄罗斯交战!英军今天就能参战?无力应对高强度战争

欧洲准备与俄罗斯交战!英军今天就能参战?无力应对高强度战争

鹰眼Defence
2024-11-26 17:36:09
今天A股见证奇迹!A股尾盘再现神秘力量,下周见证史诗级别信号

今天A股见证奇迹!A股尾盘再现神秘力量,下周见证史诗级别信号

一丛深色花儿
2024-11-27 11:51:08
网传女子高速一边智驾,一边玩牌!网友提醒被反怼“那是你没有”

网传女子高速一边智驾,一边玩牌!网友提醒被反怼“那是你没有”

火山诗话
2024-11-26 11:54:17
含金量十足!柔佛上赛季联赛25胜1平夺冠,近期5连胜进18球0丢球

含金量十足!柔佛上赛季联赛25胜1平夺冠,近期5连胜进18球0丢球

直播吧
2024-11-26 22:22:15
湖人为什么三连败,詹姆斯忍不住说出心里话,原来如此

湖人为什么三连败,詹姆斯忍不住说出心里话,原来如此

懂球哥评球
2024-11-27 16:06:03
华为“史上最强大Mate”正式发布!首发卫星寻呼功能,余承东:靠抄袭是没有未来的,能超越Mate的只有Mate

华为“史上最强大Mate”正式发布!首发卫星寻呼功能,余承东:靠抄袭是没有未来的,能超越Mate的只有Mate

每日经济新闻
2024-11-26 15:31:11
连换3人后闪崩?瓜帅:3-0领先时,我看不到任何危险了

连换3人后闪崩?瓜帅:3-0领先时,我看不到任何危险了

直播吧
2024-11-27 07:04:12
是突破,不是领先!F级G15燃气轮机距离一流仍有2至3代差距

是突破,不是领先!F级G15燃气轮机距离一流仍有2至3代差距

今日养生之道
2024-11-27 14:15:31
588 万大单。。。卷到了 94 万。。。

588 万大单。。。卷到了 94 万。。。

云头条
2024-11-26 23:18:20
中国向巴西提供人民币贷款

中国向巴西提供人民币贷款

参考消息
2024-11-27 14:52:16
《繁花》之后唐嫣又出新作,面部僵硬“状态大变”,不如以前美了

《繁花》之后唐嫣又出新作,面部僵硬“状态大变”,不如以前美了

流水的娱乐
2024-11-27 13:01:56
吴柳芳账号被封禁,眼含泪花,称我爸妈都看我直播跳舞,支持我的

吴柳芳账号被封禁,眼含泪花,称我爸妈都看我直播跳舞,支持我的

柚子新媒
2024-11-25 17:56:26
你以为是上火?其实是癌症来临了!身体的3种表现不要不当回事!

你以为是上火?其实是癌症来临了!身体的3种表现不要不当回事!

医学原创故事会
2024-11-25 00:56:13
赛季报销?赵睿发声,官宣决定,新疆男篮批准,阿不都祝福

赛季报销?赵睿发声,官宣决定,新疆男篮批准,阿不都祝福

东球弟
2024-11-27 11:34:31
就在今天,申京打爆戈贝尔,还刷新77年来NBA的历史纪录

就在今天,申京打爆戈贝尔,还刷新77年来NBA的历史纪录

大西体育
2024-11-27 14:03:35
特朗普与马斯克闹翻?损失惨重

特朗普与马斯克闹翻?损失惨重

亚太观澜
2024-11-26 20:50:02
刚刚,一地发生巨响!网友:门和窗户都在震

刚刚,一地发生巨响!网友:门和窗户都在震

鲁中晨报
2024-11-27 14:44:05
刚刚!日本连发地震!

刚刚!日本连发地震!

鲁中晨报
2024-11-27 09:48:07
歼20一起飞就被越南雷达锁定了?真相让人不寒而栗!

歼20一起飞就被越南雷达锁定了?真相让人不寒而栗!

常高俊April工作室
2024-11-27 09:45:02
2024-11-27 16:51:00
孙有匪
孙有匪
科技
1595文章数 2008关注度
往期回顾 全部

科技要闻

余承东:Mate70对得起那四字 靠抄袭没未来

头条要闻

幸福航空员工称被长期欠薪 前党委书记为讨薪曾起诉

头条要闻

幸福航空员工称被长期欠薪 前党委书记为讨薪曾起诉

体育要闻

扣篮命中率28%,NBA首发前锋

娱乐要闻

天呐鹿晗瘦了这么多,像漫画出来的

财经要闻

洪灏刘煜辉对谈实录 涉及A股、债务等!

汽车要闻

中国的超豪华车尊界S800 预售百万起/ L3级智驾

态度原创

手机
旅游
艺术
数码
健康

手机要闻

Varjo Teleport服务上线:用苹果iPhone将现实世界“搬进”VR

旅游要闻

张家界新景点“飞拉达”位于5000英尺高空

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

数码要闻

OneGx 2 掌上游戏本结构确认:虚拟键盘 + 可拆卸实体键盘组合

花18万治疗阿尔茨海默病,值不值?

无障碍浏览 进入关怀版