设为首页 加入收藏

TOP

玩转宏定义——从入门到进阶(一)
2023-07-23 13:28:14 】 浏览:63
Tags:从入门

 

宏定义是什么


??宏定义(macro definition)是 C/C++ 中的一种预处理指令,可以在编译之前替换源代码中的一些文本。简单来说就是用宏自定义了一些其它符号,这些符号在使用时全等于被替换的内容。

#define  DATE??   "2023_01_20"
#define  FILE_NUM??250

上面两个例子中表现的就是宏定义的基本格式 #define+若干空格+自定义符号+若干空格+被替换内容,DATE在代码的任何部分都可以直接当做"2023_01_20"这段字符串使用,同理FILE_NUM也可以直接用来当做250。不过这种替换是简单粗暴,不带任何修饰的,这种特性也带来一定的问题,在下面用好宏定义板块会提到这些问题,并教给你如何避免这种问题。

#define    WORKING_DIE??“/home/lcc/linux/nfs/rootfs/lib/modules/4.1.15/all_flile/c_text/for_text/”

我们有时候会宏定义一些比较长的数据,像上面这样,这样会显得代码看起来特别的臃肿,可以使用\(续行符) 将宏定义的内容分割开,当然分割前后的宏替换内容是一致的。

#define  WORKING_DIE??“/home/lcc/linux/nfs/rootfs/lib/\
??????????????????modules/4.1.15/all_flile/c_text/for_text/”

通过使用 \,可以让代码看起来更加的整洁,提高了代码的可读性,但是在使用时,一定不能让 \右侧出现除了换行符以外的任何字符,空格也不可以,否则会导致错误出现。

 

用好宏定义


??虽然说宏定义看起来很简单,不过合理的使用会给编程带来极大的便利,能提高程序的可读性和可维护性,而且通过与函数等的结合也具有很大的灵活性。接下来主要从常量替换、整体、集合体几个方面来谈谈宏定义的应用,以及这些用法可能带来的问题及解决方法,当然宏的很多应用在C语言中都有替代的方案,这些方案在不同情况下使用会有优劣之分,明确了这些,在某一场景下做出正确的选择,我们才能算真正意义上掌握了宏。讲完这些,希望各位保持好奇心,坐稳了,开始发车!

常量替换

int a = 2;
float b = 3;
if(4 > 5)
#define  MAX_LEN??22

??代码中能被我们直接观察到的数据就是常量,所以常量又被称为字面量,而且常量是在程序执行期间都不会发生改变的值。以上代码块中以数字形式出现的都是常量,它们在程序运行开始时会被加载入内存中的常量区里,块中的第四行就是通过宏实现对常量的替换。

int a = 22;
int a = MAX_LEN;

以上两行代码的效果是等效的,都实现了对a赋值22。这时有人可能会问了,不就赋个值嘛,为啥搞得这么麻烦。诶,你还别说,宏替换用到好处不仅不会使代码显得冗杂,还会提高代码的可读性,有利于程序的维护和开发, 不信,咱接着看。

 

常量替换的作用

  • 赋予数据意义

??在刚开始接触编程的时候,我们是为了学习编程而编程。这个阶段的编程脱离现实,或者说是对某些现实的抽象,我们们仅仅是重复性的使用编程规则已达到熟悉编程规则的目的,很少会根据具体的现实情景进行编程。

??在深入学习编程之后,我们编程的目的从学习编程本身变成了通过编程来解决现实问题。解决现实问题的过程中,就需要对一些事物的属性进行抽象成数据,而有些数据总是不变的,我们这时候就可以以宏定义的方式对这些常量数据进行命名,来使代码更加的清晰、有条理。

#define  MON_DAY       1
#define  TUES_DAY      2
#define  WEDNES_DAY    3
#define  THURS_DAY     4
#define  FRI_DAY       5
#define  SATUR_DAY     6
#define  SUN_DAY       7

在某些情景中,需要用到每天的日期信息,如果直接使用1、2、3…来表示会另阅读代码的其他人头疼不已,就连我们自己几个月后检查代码时可能会忍不住飙几句脏话,如果使用宏定义则会明朗许多。

??总之,前期的学习我们很少会遇到赋予常量意义的情况,这时候我们也不用担心,在后期面临现实情景的时候我们再在去认真思考也不迟,不过现实情况总是千遍万化,难有一个通法,需要实际问题,实际处理,上面用星期的举例也就当是抛砖引玉了,如何灵活、恰当的使用宏定义赋予数据意义,需要在阅读他人优秀代码与自己的实践中慢慢体会。

  • 替换重复出现的固定常量
#define  PI    3.14159
double r = 3;
double area = PI * r * r;
double perimeter = 2 * PI * r;

??在上面这个例子中,圆周率是重复出现的,通过宏定义进行替换可以提高代码的可维护性,因为宏定义可以方便地修改常量的值,而不需要在多个地方进行修改。

  • 替换目前不能确定或未来有可能改变的数值
#define  MAX_LEN        20
char buf[MAX_LEN];

??我以前在编程时,会习惯性的凭感觉设置数组大小,但是现实总是啪啪打脸,代码编译时没有问题,一运行段错误就出现了,问题是代码越栈了。如果码量小一点还好,一旦码量稍大,排查起来是真的痛苦。我们可以用宏来限定灵活限定数组大小,减少这类问题给编程带来的痛苦体验。

对于这类问题需要替换的仅仅是目前不能确定大小的数组,有的数组大小我们完全在编程时就能够明确,就完全没有替换的必要,就害怕有些小伙伴看到这么已用好像高大上的样子,不管三七二十一,盲目的对代码进行替换,需要记住我们使用的任何方法与技巧都是为了写出更优秀、更高质量的代码,而不是所谓花哨与高大上。

当然以上虽说是用数组进行举例,不过不能仅仅拘泥于数组,更多场景需要在编程时根据具体情况去发现、去处理,但是万变不离其宗是它们都有一个共同的特性——数值目前不能确定

#define IP_DEER  "192.168.1.100"

??编程时有些数据在当下是确认的,但在未来也可能会被修改,这种改变的原因并不来源于错误,而可能伴随着代码需求的改变。前几天在进行网络编程时,需要确定被连接一端的IP地址,但是在刚开始编写时肯定是用自己周边的触手可及的一些IP地址来测试程序,而不是一上来就用最终实现的IP地址,这样做是为了前期方便编写以及排查程序问题。在这个过程中前期使用"192.169.1.100"的目的是为了方便调试代码,后面将IP_DEER修改为192.168.1.50才算是整个程序的完工。

常量替换需谨慎                                                                      

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇英语打字练习软件-c语言编写 下一篇三维模型轻量化方面存在主要问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目