#define
叫做 宏定义命令
,它是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部原样替换成指定的字符串。
宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单粗暴的替换。字符串中可以含任何字符,它可以是常数、表达式、if 语句、函数等,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。
合法标识符都可以用来做宏名,但业内的使用习惯是宏名字母要全大写。因为全部字母都大写不能使用驼峰命名法所以在显式标识符的分域或分词时要用下划线来隔开。
#define BUF_SIZE (128)
#define ENET_IRQ_NUM (150)
宏定义一个常数,能提高代码可读性,也能方便对常数的修改,尤其是同一个常数被多处使用时。如下例所示,用 PI
来定义 3.1415926
,在计算圆的面积和周长时都会将 PI
替换为 3.1415926
来进行计算。
#define PI (3.1415926)
/*********************************************************************************************************
名 称: circleArea
描 述: 求圆的面积
输 入: r 半径
输 出: 圆的面积
*********************************************************************************************************/
float circleArea (float r)
{
return (PI * r * r);
}
/*********************************************************************************************************
名 称: circlePerimeter
描 述: 求圆的周长
输 入: r 半径
输 出: 圆的周长
*********************************************************************************************************/
float circlePerimeter (float r)
{
return (2 * PI * r);
}
通过一段更易懂的常数算式来表示常数,更能提高代码可读性,同时也不用人工来计算该常数。常数算式是在编译时就进行计算了,不会消耗目标CPU的时间。
#define YEAR_SECONDS (60 * 60 * 24 * 365UL)
宏定义的内容要用括号括起来,防止展开时表达错误。如下所示,函数 func
本来是要算两数和与差的乘积,但实际展开却成了a + b * a - b
因为相乘运算的优先级高,使得计算顺序与预期不符。如果把定义内容扩起来则不会出现这种问题。
#define SUM(a, b) a + b
#define DIF(a, b) a - b
int func (int a, int b)
{
return (SUM(a, b) * DIF(a, b));
}
func(4,1) ==> 4 + 1 * 4 - 1 ==>4 + 4 - 1 ==> 7
#define SUM(a, b) (a + b)
#define DIF(a, b) (a - b)
int func (int a, int b)
{
return (SUM(a, b) * DIF(a, b));
}
func(4,1) ==> (4 + 1) * (4 - 1) ==>5 * 3 ==> 15