从单片机基础到程序框架(全集 2019pdf版).pdf - 第254页

while(1) { } } 经过编译器 “预编译” 的“机械化替换 ”后, 等效于以下代 码: unsigned l ong x=3; unsigned l ong a; unsigned l ong b; unsigned l ong c; void m ain() //主函 数 { a=x*3; b=x*(2+6 ); c=x*2+6; while(1) { } } 【59.3 #define 在常量上的“一键替换”功能。 】 上…

100%1 / 836
第五十九节: 全局“一键替换”功能的#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;
}
else //否则输出 0
{
b=0;
}
while(1)
{
}
}
上述程序现在用#define 来替换,等效如下:
#define 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;
}
else //否则输出 0
{
b=0;
}
while(1)
{
}
}
【59.4 #define 在运算式上的“一键替换”功能。
#define 在运算式上应用的时候有一个地方要特别注意,就是必须加小括号“()”否则容易出错。
为#define 的替换是很“机械呆板”的,它只管“字符编辑层面”的机械化替换,举一个例子如下: