宏定义又称为宏替换、宏代换,简称“宏”,是C提供的三种预处理功能1.的其中一种。其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的支行效率2.

  1. #define命令

define命令是C语言中的一个宏定义命令,它用来讲一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义(不带参数的宏定义),另一种是带参数的宏定义。

  1. 简单的宏定义

格式:#define<宏名/标识符><字符串>
eg: #define PI 3.1415926
说明:

  1. 宏名一般用大写
  2. 宏定义末尾不加分号:
  3. 可以用#undef命令终止宏定义的作用域
  4. 宏定义可以嵌套
  5. 字符串“”中永远不包含宏
  6. 宏替换在编译前进行,不分配内存,变量定义分配内存,函数调用在编译后程序运行时进行,并且分配内存
  7. 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查
  8. 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
  9. 带参数的宏定义(除了一般的字符串替换,还要做参数代换)

格式: #define < 宏名>(<参数表>)<字符串>
eg : #define S (a,b) ab
area=S(3,2);
第一步被换为area=a
b; 第二步换为area=3*2;
一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被 定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
说明:

  1. 实际参数如果是表达式 容易出问题

define S(r) rr
area=S(a+b);
那么r=a+b,
第一步做字符串替换:area=r
r,第二步再做参数替换:area=a+ba+b
当定义为#define S(r)(r)
(r)时,
第一步做字符串替换:area=(r)(r) ,第二步再做参数替换:
area=((a+b)
(a+b))

  1. 宏名和参数的括号间不能有空格
  2. 宏替换只做替换不做计算,不做表达式求解
  3. 宏的实际结合不存在类型,也没有类型转换
  4. 宏展开不占用运行时间,只占用编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
  1. 宏定义易错点示例总结

define 第一位置 第二位置

  1. “”内的东西不会被宏替换

define NAMEzhang
程序中有“NAME”则,它会不会被替换呢?
答:否

  1. 宏定义前面的那处必须是全法的用户标识符(可以使用关键字)

define 0x abcd
可以吗?也就是说,可不可以用把标识符的字母替换成别的东西?
答:否

  1. 第二位置如果有字符串,必须“”配对

define NAME”zhang
这个可以吗?
答:否

  1. 只替换与第一位置完全相同的标识符

define “zhangyuncong”
程序中有上面的宏定义,并且,程序里有句:NAMELIST这样,会不会被替换成”zhangyuncong”LIST
答:否

  1. 带参数宏的一般用法

例如:

  1. define MAX (a,b) ((a) > (b) ? (a) : (b) )

则遇到MAX(1+2,value) 则会把它替换成:
第一步替换字符串,MAX(a,b)=MAX( ((a) > (b) ? (a) : (b) )
第二步替换 参数替换 =MAX((1+2)>(value)? (1+2):(value))