C/C++编程笔记:浅析C语言中宏定义的使用,知识点全解

时间:2022-10-09 18:03:40 | 浏览:1860

宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名。给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法,但是使用不慎会得到

宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名。给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法,但是使用不慎会得到意外的结果。

  宏是C语言中常用的编译预处理功能之一。在编程时,可以使用宏来代替一些常量或表达式,给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率。另外,在C语言中,宏是产生内嵌代码的唯一方法,并且可以定义带参数的宏,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。但是如果对宏命令本质理解不透彻,在使用时可能运行的结果与预期的结果就会大相径庭。下面具体介绍C语言中宏的使用(即宏定义、宏调用、宏展开)。

一、宏定义

  在C语言源程序中,允许用一个标识符表示一个字符串,称为“宏”;被定义为宏的标识符称为“宏名”。

  宏定义是由源程序中的宏定义命令完成的。该命令有两种形式:一种是无参数的宏定义;另外一种是带参数的宏定义。

  (一)无参数的宏定义

  无参数宏的宏名后不带参数。其定义的一般形式为:

  #define标识符字符串

  #是预处理命令的标志,define是宏定义命令的标志。标识符为宏名,字符串可以是常量、表达式、格式串等。

  例如:#definePI3.1415926

  #defineSUM (1+2)

  (二)带参数的宏定义

  带参数的宏定义,也称为宏函数,在宏定义中的参数称为形式参数,形式参数不分配内存单元,所以不必作类型定义。带参数的宏定义的一般形式如下:

  #define宏名(参数表)宏体

  例如:#defineAREAR(R)3.14*R*R

   #define SUM(X,Y) X+Y

  两种格式的宏定义必须写在函数的外边,其作用域为宏定义命令起到源程序结束,若要终止其作用域可以用#undef命令加宏名,宏定义也允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。

二、宏展开及宏调用

  (一)宏展开及调用的概念

  编译预处理时程序中出现的所有宏名都要有宏定义中的字符串来代换,称为宏展开。嵌套的宏定义,展开时要层层展开。程序中字符串内的字符跟宏名相同时作为一般字符处理,不用宏展开。对于带参数的宏的使用称为宏调用,一般形式为:宏名(实参表);在调用中,不仅要宏展开,而且要用实参去代换形参。

  C语言源程序的处理过程,经历了编辑、预处理、编译、连接几个过程。其中预处理产生编译的输入,源文件中若有宏命令,则预处理器将其展开成相应的宏定义,这个阶段的工作只是纯粹的替换展开,没进行任何的计算。同时现有的编译系统没有提供独立的预处理系统进行预处理,所以我们看不到预处理后的代码,在编译时可能会出现错误,但是系统检测不出来。所以在宏展开时我们一定要谨慎。

  (二)宏展开及调用的应用实例

  1.无参宏的定义实例

  例题1:求圆的周长及面积。

  源程序:

  #definePI3.14159

  main()

  {float r,c,s;

  scanf(“%f”,&r);

  c=2*PI*r;

  s=PI*r*r;

  printf(“周长为:%f,面积为:%f”,c,s);}

  本题中的PI为宏名,在程序中出现宏名的地方直接用字符串3.14159代替即可得宏展开后的程序,并能计算出结果。

  例题2:源程序:

  #defineN2+1

   main()

   {int a;

  a=N*N;

  Printf( % d,a); }

  本题中宏名N代表的是表达式2+1,使用时容易产生的错误是先把N计算出来2+1=3,然后再带入求a的值,a=3*3,结果为9。但实际上宏展开只是简单的代替,不进行计算,本题应该这样计算a=2+1*2+1,得到结果为5。

  2.带参宏的定义实例

  例题3:源程序:

  #define f(x)(x*x)

  main()

  {inti1, i2;

  i1=f(8)/f(4);

  i2=f(4+4)/f(2+2);

  Printf(%d,%d,i1,i2);}

  本题的输出结果是4,3。i1,i2看上去参数一样为什么结果不同呢,实际上二者的调用、展开形式不同,其中i1=(8*8)/(4*4)=64/16=4,i2=(4+4*4+4)/(2+2*2+2)=24/8=3;和例题2一样宏展开只是简单的代替,不先进行计算。

  3.宏使用中问题的解决方法。若想正确的使用好宏,应当做到如下两方面:一方面在读别人的程序时,先将程序中对宏的使用全部替换成它所代表的字符串,不要添加任何其他符号,完全展开后再进行计算。另一方面在自己编程时,简单的无参宏定义中当字符串中不只一个字符时,加上括号表现出优先级,带参的宏定义则要给宏体中的每一个参数加上括号,并在整个宏体上再加上一个括号。

  看到这里有人不禁会想,宏使用时那么麻烦、谨慎,我们为什么还要使用它,把它摈弃掉算了。但是宏定义的使用有很多的好处。

三、宏定义的优点

  (一)简化程序提高可读性

  使用宏可以将程序中的常量用有意义的符号代替,当常量比较长时, 以用较短的有意义的标识符来写程序, 这样更方便一些。当常量值需要改变时,不必在整个程序中查找常量,只需改变宏定义就可以方便地修改常量值,因此程序修改方便;使程序更加清晰,便于阅读和理解; 所说的常量改变不是在程序运行期间改变而是在编程期间的修改。

  (二)提高程序的运行效率

  更为有效的是C语言允许带参数宏定义,C语言带参数宏定义可以代替简单的函数,完成类似函数调用的功能。虽然函数的使用可以使程序更加模块化,便于组织,而且可重复利用。但在函数调用时,需要保留调用函数的现场,以便子函数执行结束后能返回继续执行,同样在子函数执行完后要恢复调用函数的现场,这都需要一定的时间。如果子函数执行的操作比较多,这种转换时间就会更大,而参数宏定义在宏调用展开后相当于直接嵌入代码 ,比函数调用具有更高的时间效率。使用带参数的宏,不占有内存,即能减少系统内存的使用,提高运行效率。

四、结束语

  本文对C语言中宏定义的使用进行了分析,并从C语言源程序处理过程的角度对宏的处理进行了分析,提出了避免错误的方法,也对它的优点进行了阐述。只要能够理解宏展开的规则,就能够体会宏使用带来的方便和效率了。

想要在程序员生涯内有更高的成就的话,最最重要的是尽可能的提升自己的编程能力,并且,与其想着怎么去提升,不如从现在开始动手动脑,如果对于C/C++感兴趣的话,可以关注+私信小编【C/C++编程】有一些视频希望可以帮助到你,学习不怕从零开始,就怕从不开始。


相关资讯

程序员都要学C语言,因为它是编程基础语言吗?原因你意想不到

随着互联网的发展以及编程技术的不断更新,编程语言的种类也是越来越多,甚至现在的话针对每一个互联网的领域,都有不同的适合它的编程语言。不同的语言是为了实现不同的目标而设计的。不过无论你是一个有经验的程序员,还是你是这个编程网络中的新手,有一

C++编程调试秘笈:c++的缺陷来自哪里?

C++语言是非常独特的。虽然实际上所有的编程语言都从其他语言中吸收了一些思路、语法元素和关键字C++却是吸收了另一种完整的语言,即C语言。事实上, C++语言的创建者Bjarne Stroustrup原先把他的新语言命名为"带类的C"。这意

C++编程自学宝典:初识C++语言

第1章初识C++为什么选择C++?从读者自身的实际情况来看,原因有很多。读者选择C++可能是因为必须为一个C++项目提供技术支持。在超过30年的生命周期中,该项目中已经包含了数百万行C++代码,并且大部分流行的应用程序和操作系统是使用C+编

少儿编程是伪命题还是智商税?

近几年,少儿编程的概念很火,国家教育部门也鼓励有条件的中小学开展相关课程,有些省市的教育部门都把这些列入了教育发展大纲。越来越多的社会资本和机构进入到这个行业中来,少儿编程的连锁培训机构也开遍了各大城市,连我老家,这个GDP排名全国100开

少儿编程市场火爆儿童是否有必要提早接触编程课

央广网北京7月11日消息(总台央广记者李行健 韩雪莹)据中央广播电视总台中国之声《新闻纵横》报道,近年来,处于资本风口的少儿编程市场发展迅猛,从4岁到16岁的儿童都成为了少儿编程课程的潜在客户。与此同时,有关“儿童是否需要提早接触编程课?”

少儿编程到底在编啥?了解课程体系后再决定报不报班

今天我们来聊一聊最近很火的少儿编程。二哈本汪作为一个退役码农,在我的印象中编程一直就是我们屌丝的专属运动。相信大家也都普遍认为秃头,肥胖,油腻就是程序员的统一形象。可最近编程却硬生生地被炒成了一项贵族运动,并且深受家长们的追捧。不管懂不懂,

什么是少儿编程?有一个家长曾经这样问我

少儿编程,现在不管是从国家政策方面还是从现阶段中小学学生课外兴趣的学习,都是比较火热的一个领域,有着非常巨大的市场。受政策红利,2019年有幸进入少儿编程行业,其实很早就接触到了少儿编程,而且对此有了一定的了解。二线省会城市的少儿编程行业还

少儿编程市场“过度繁荣”,背后是家长们的竞争压力

如今,与“少儿编程”有关的广告、宣传越来越多,已经成了一个明显趋势。6月5日,《新京报》的一篇深度报道,为读者展示了正在高速发展与扩张的儿童编程培训市场的一角。一家教育类垂直媒体发布的《2018年教育行业蓝皮书》显示,截至2018年8月,已

教育行业深度报告:少儿编程专题研究

(登陆未来智库 「链接」 获取本报告及更多卓越报告。)少儿编程是指针对3-18 岁少年儿童开展的编程教育,通过编程游戏启蒙、可视化图形编程等课程,培养学生的计算思维和创新解难能力。本报告讨论的少儿编程行业主要包括研发生产编程教育软硬件工具和

什么是少儿编程?

#本文无任何广告,大家放心阅读。少儿编程作为时下较为火热的素质类课程,对比其他课程例如美术,舞蹈,跆拳道等,显得有点陌生,许多家长一说少儿编程,就会想到程序员,觉得很高级,很专业,不适合孩子学习。其实换个思路,想一想孩子学篮球,是为了成为运

友情链接

SEO域名抢注宝宝起名网妈妈知道币圈湖北旅游网TCL冰箱评测网奈雪的茶会员日金丝玉网今日哈尔滨项目招投标官网阿瑞娜泳装九寨沟旅游攻略网睫毛膏品牌网男装奢侈品牌网CoCo都可优惠券瑞士旅游网罗浮山旅游攻略福州新闻资讯网元宇宙资讯网
PHP编程知识网-php开源建站系统、PHP程序员网站开发、php编程工具、php菜鸟教程下载、PHP网络编程教学、php网络编程、php工程师、php菜鸟教程数据库、PHP网站开发、PHP精品源码网站、php程序员入门、php零基础入门教程、php源码搭建网站流程、php从入门到精通第2版、php开发简单网站、php制作网站实例、php网站开发实例教程源代码、php中文网破解版、php中文网。
php编程知识 yoceo.cn ©2022-2028版权所有