时间:2022-10-09 18:03:40 | 浏览:1910
宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名。给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法,但是使用不慎会得到意外的结果。
宏是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++编程】有一些视频希望可以帮助到你,学习不怕从零开始,就怕从不开始。
于是快马加鞭地赶出了下篇。 其实本来写完上篇后我脑袋里对下篇的框架已经有了大概的构思。但后来从文章的留言,读者微信群里的讨论,以及大家私下给平台小助手、给我发的微信留言中发现,“咦,原来大家最关心的问题跟我之前的设想还是有点儿出入哦~”。于
少儿编程热,需要冷思考(大家谈)在不少城市,少儿编程课外培训日渐火爆。很多人认为,作为数字世界的通用语言,学习编程能有效锻炼孩子的思维能力。但也有人提出问题:受理解力所限,幼儿园阶段就送孩子学编程是否符合教育规律?出于“莫输在起跑线上”的心
孩子成长中的每一件事都不是小事,成长是一次没有返航的旅程。家长为了孩子能够长成参天大树,会带孩子学各种各样的知识,少儿编程便成为了很多家长的心头好。对于编程课,你了解多少但是很多家长并不知道孩子适不适合学习编程,也不知道编程是什么?就知道学
少儿编程越来越火,从一线城市到二三线城市,编程培训机构如雨后春笋般涌现。少儿编程培训为什么这么火?家长们的“狂热”究竟值不值得?家长:人工智能是趋势,希望孩子早接触“机器人课程确实挺贵的,一下子就交了1万5左右的套餐费,每次课大概160元左
这两年,少儿编程越来越火了,不少地区已将它纳入中小学教育。不少国家的政策将少儿编程以及人工智能编入了教育学习项目,甚至浙江编程是高考选考科目,各位宝妈们都处处欲动,很重视孩子的编程教育。想必很多家长在给孩子选课的路程多少经历了很久,那么小编
一、C语言程序的构成与C++、Java相比,C语言其实很简单,但却非常重要。因为它是C++、Java的基础。不把C语言基础打扎实,很难成为程序员高手。1、C语言的结构先通过一个简单的例子,把C语言的基础打牢。C语言的结构要掌握以下几点:(1
1、从C到C++计算机诞生初期,用机器语言或汇编语言编写程序;第一种高级语言FORTRAN诞生于1954年;BASIC语言(1964)是由FORTRAN语言的简化而成的是为初学者设计的小型高级语言;C语言是1972年由美国贝尔实验室的 D.
这个问题在入门阶段一直是争议十分大的问题,反正学长每次去网上找新手应该学什么编程语言的时候,就会出现五花八门的推荐,n多语言,n多推荐,搞的新手一会听说这种语言适合新手,于是学习这种语言。一会又有人说xx语言是垃圾、弱爆了,学了也没用,之类
假期在家待得怎么样?是不是天天过着衣来伸手饭来张口的日子,当然也时常伴随着妈妈的“嫌弃”和“唠叨”?哈哈~文章来源:博学谷接下来,丫姐跟你说一件丫姐在过年期间发生的有意思的事儿:小侄子:姑姑,你会不会编程?我答:会啊...小侄子:那你教教我
选择第一门语言是非常重要的,因为这是搭建基础的开始,自此以后我们会逐渐走进并了解编程世界。但老实说,选择哪一种编程语言并不十分重要,重要的是我们需要掌握它,并用它来提高自己解决问题和开发的能力。此后,要再从一种语言切换到另一种语言就会变得轻
计算机编程语言可用于将指令传达给计算机。它们基于某些句法和语义规则,定义了编程语言中每种结构的含义。现在我得到了一个凡是可以找得到的每种编程语言的列表。我将它们分为以下几类:解释型编程语言函数式编程语言编译型编程语言过程式编程语言脚本编程语
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样
运算符是任何编程语言的基础。因此,如果不使用运算符,则C / C ++编程语言的功能是不完整的。我们可以将运算符定义为符号,以帮助我们对操作数执行特定的数学和逻辑计算。换句话说,我们可以说运算符对运算对象进行运算。例如,考虑以下语句:c =
不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。这一点很重要,连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使
C++是否是最难学的编程语言?这个问题我不确定。很多人都感觉或者说听说C++是最难学的,但是有句老话说得好:难者不会,会者不难!这不,说C++是最难的编程语言,还是有许多的程序员学会了,而且鉴于这门语言的强大,学会的人薪资待遇还相当不错。在