从单片机基础到程序框架(全集 2019pdf版) - 第253页
第五十九节: 全局“一键替换”功能的#define。 【59.1 #define 作用和书写格式。 】 上一节讲 co nst 的时候,讲 到了当 某个常量在程 序中是属于需 要频繁更改的 “阀值” 的时候,用 c onst 就可以提供“ 一键更改” 的快捷服务 。本节的 #define 也具 有此功能, 而且功 能比 const 更加强大灵 活, 它 除了可以应 用在常量, 还可 以应用在运算 式以及函 数的 “一键更改” 中。 所谓…

第 1 个数
十进制:0
十六进制:0
二进制:0
第 2 个数
十进制:1
十六进制:1
二进制:1
第 3 个数
十进制:28
十六进制:1C
二进制:11100
第 4 个数
十进制:28
十六进制:1C
二进制:11100
分析:
a 为 0。
b 为 1。
c 为 28。
d 为 28。
【58.8 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第五十九节: 全局“一键替换”功能的#define。
【59.1 #define 作用和书写格式。】
上一节讲 const 的时候,讲到了当某个常量在程序中是属于需要频繁更改的“阀值”的时候,用 const
就可以提供“一键更改”的快捷服务。本节的#define 也具有此功能,而且功能比 const 更加强大灵活,它
除了可以应用在常量,还可以应用在运算式以及函数的“一键更改”中。所谓“一键更改”,其实是说,#define
内含了“替换”的功能,此“替换”跟 word 办公软件的“替换”功能几乎是一模一样的。#define 的“替换”
功能,除了在某些场合起到“一键更改”的作用,还可以在某些场合,把一些在字符命名上不方便阅读理解
的常量、运算式或函数先“替换”成容易理解的字符串,让程序阅读起来更加清晰更加方便维护。#define
的常见三种书写格式如下:
#define 字符串 常量 //注意,这里后面没有分号“;”
#define 字符串 运算式 //注意,这里后面没有分号“;”
#define 字符串 函数 //注意,这里后面没有分号“;”
具体一点如下:
#define AA 1 //常量
#define BB (a+b+c) //运算式
#define C add() //函数
需要注意的时候,#define 后面没有分号“;”,因为它是 C 语言中的“预处理”的语句,不是单片机运
行的程序指令语句。
【59.2 #define 的编译机制。】
#define 是属于“预编译”的指令,所谓“预编译”就是在“编译”之前就开始的准备工作。编译器在
正式编译某个源代码的时候,先进行“预编译”的准备工作,对于#define 语句,编译器是直接把#define
要替换的内容先在“编辑层面”进行机械化替换,这个“机械化替换”纯粹是字符串的替换,可以理解成 word
办公软件的“替换”编辑功能。比如以下程序:
#define A 3
#define B (2+6) //有括号
#define C 2+6 //无括号
unsigned long x=3;
unsigned long a;
unsigned long b;
unsigned long c;
void main() //主函数
{
a=x*A;
b=x*B;
c=x*C;

while(1)
{
}
}
经过编译器“预编译”的“机械化替换”后,等效于以下代码:
unsigned long x=3;
unsigned long a;
unsigned long b;
unsigned long c;
void main() //主函数
{
a=x*3;
b=x*(2+6);
c=x*2+6;
while(1)
{
}
}
【59.3 #define 在常量上的“一键替换”功能。】
上一节讲 const(或 code)的时候,举了一个“阀值”常量的例子,这个例子可以用#define 来替换等
效。比如,原来 const(或 code)的例子如下:
code unsigned char Cu8Level=90; //需要调整“阀值”时,只需更改一次这里的“90”这个数值。
unsigned char a;
unsigned char b;
void main() //主函数
{
if(89>=Cu8Level) //大于或者等于阀值,就输出 1。
{
a=1;
}
else //否则输出 0。
{
a=0;
}
if(95>=Cu8Level) //大于或者等于阀值,就输出 1。
{
b=1;