#define宏定义

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

一般形式:

1)#define 标识符 字符串

如:#define PI 3.1415926

 2)还可以用#define命令定义带参数的宏定义。其定义的一般形式为:

define 宏名(参数表) 字符串 

如:#define S(a, b) a*b  //定义宏S(矩形面积),a、b为宏的参数

使用的形式如下:

    area=S(3, 2);
用3、2分别代替宏定义中的形式参数a和b,即用3*2代替S(3, 2)。因此赋值语句展开为:
    area=3*2;

 宏替换是简单的替换,替换后才进行编译

例1 #define N 2+2
void main()
{
   int a=N*N;
   printf(“%d”,a);
}
 
 上述问题的计算为 2+2*2+2,并不是(2+2)*(2+2)。
(2)解决办法:
  1. /*将宏定义写成如下形式*/
  2. #define N (2+2)
  3. /*这样就可替换成(2+2)*(2+2)=16*/

  

#define area(x) x*x
/*这在使用中是很容易出现问题的,看如下的程序*/
void main()
{
    int y = area(2+2);
    printf(“%d”,y);
}

按理说给的参数是2+2,所得的结果应该为4*4=16,但是错了,因为该程序的实际结果为8,仍然是没能遵循纯粹的简单替换的规则,又是先计算再替换 了。

在这道程序里,2+2即为area宏中的参数,应该由它来替换宏定义中的x,即替换成2+2*2+2=8了。那如果遵循(1)中的解决办法,把2+2 括起来,即把宏体中的x括起来,是否可以呢?#define area(x) (x)*(x),对于area(2+2),替换为(2+2)*(2+2)=16,可以解决。

但是对于area(2+2)/area(2+2)又会怎么样呢,有的学生一看到这道题马上给出结果,因为分子分母一样,又错了,还是忘了遵循先替换再计算的规则了,这道题替换后会变为 (2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除运算规则,结果为16/4*4=4*4=16,那应该怎么呢?解决方法是在整个宏体上再加一个括号,即#define   area(x) ((x)*(x)),不要觉得这没必要,没有它,是不行的。  

如果是自己编程使用宏替换,则在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级,如果是带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。

 

posted @ 2022-03-01 14:12  泰勒斯儿童营养牙膏  阅读(299)  评论(0编辑  收藏  举报