永发信息网

在定义一个宏的时候要注意什么

答案:1  悬赏:80  手机版
解决时间 2021-01-13 07:26
在定义一个宏的时候要注意什么
最佳答案
#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。
1 #define命令剖析
1.1 #define的概念
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
(1) 简单的宏定义:
#define <宏名>  <字符串>
例: #define PI 3.1415926
(2) 带参数的宏定义
#define <宏名> (<参数表>) <宏体>
例: #define A(x) x
一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
1.2 宏替换发生的时机
为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程,见图1。

源程序

预处理器

修改后的源程序

编译器

汇编程序

汇编器

可重定位的目标程序

连接器

可执行的目标程序

图1 C语言的编译过程
其中预处理器产生编译器的输出,它实现以下的功能:
(1) 文件包含
可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。
(2) 条件编译
预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。
(3) 宏展开
预处理器将源程序文件中出现的对宏的引用展开成相应的宏 定义,即本文所说的#define的功能,由预处理器来完成。
经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,所以在学习#define命令时只要能真正理解这一点,这样才不会对此命令引起误解并误用。

2 #define使用中的常见问题解析
2.1 简单宏定义使用中出现的问题
在简单宏定义的使用中,当替换文本所表示的字符串为一个表达式时,容易引起误解和误用。如下例:
例1 #define N 2+2
void main()
{
int a=N*N;
printf(“%d”,a);
}
(1) 出现问题:在此程序中存在着宏定义命令,宏N代表的字符串是2+2,在程序中有对宏N的使用,一般同学在读该程序时,容易产生的问题是先求解N为2+2=4,然后在程序中计算a时使用乘法,即N*N=4*4=16,其实该题的结果为8,为什么结果有这么大的偏差?
(2)问题解析:如1节所述,宏展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏N出现的地方只是简单地使用串2+2来代替N,并不会增添任何的符号,所以对该程序展开后的结果是a=2+2*2+2,计算后=8,这就是宏替换的实质,如何写程序才能完成结果为16的运算呢?
(3)解决办法:将宏定义写成如下形式
#define N (2+2)
这样就可替换成(2+2)*(2+2)=16
2.2 带参数的宏定义出现的问题
在带参数的宏定义的使用中,极易引起误解。例如我们需要做个宏替换能求任何数的平方,这就需要使用参数,以便在程序中用实际参数来替换宏定义中的参数。一般学生容易写成如下形式:
#define area(x) x*x
这在使用中是很容易出现问题的,看如下的程序
void main()
{
int y=area(2+2);
printf(“%d”,y);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么在家自制卷发
---_______gotothecinematogetherwithme?---G
电脑开机不出现屏幕WINDOWS98是怎么回事?
如图是心脏工作示意图,请据图回答:(1)心
用3456这四合服可以组成的所有三位数中有什么
I like the book so much that I'll buy it,
王师傅加工一批零件已经加工了总数的百分之六
作文。(40分,其中卷面分5分)请以“绽放美
C++与vc++有何区别与共同点
河北省北部是什么自治区
经编机穿纱方法
1.题目:企业发放的奖金根据利润提成。利润(I
单选题对“绿叶中色素的提取和分离”实验,下
蕲春漕河镇配钥匙的地方
1到9的数字 四位数任意组合一共多少组 ?
推荐资讯
奇瑞qq30.8正时皮带多少钱一根
京祥银地址有知道的么?有点事想过去!
公民为什么要增强爱国情感,立志为国家奋斗?
英语选择题2A,帮忙做下,答案越详细越好
中国电信(天翼手机专营店)(归德路白云公馆大
“大命将泛,莫之振救”怎么翻译~!急求!
单选题知M、N是两个集合且M∩N=M,则有A.M?NB
朋友带孩子在我家玩,我刚熬好的米粥乘到碗里
牧羊人之心幽冥的梅菲尔值得培养吗 幽冥的梅
初中解方程,求详细步骤 (1) 18+5x=34-3x
a(不为0)除7等于( )……( )当商和余数相同时,
The maker of the popular game Angry Birds
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?