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

} else //否则输出 0 。 { b=0; } while(1) { } } 上述程序现 在用#def ine 来替换,等 效如下: #define Cu8Leve l 90 //需要调 整“阀值”时, 只需更改一次 这里的“9 0”这个 数值。 unsigned c har a; unsigned c har b; void m ain() //主函 数 { if(89>=C u8Level) //大于 或者等于阀值 ,就…

100%1 / 836
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 的替换是很“机械呆板”的,它只管“字符编辑层面”的机械化替换,举一个例子如下:
#define B (2+6) //有括
#define C 2+6 //无括号
unsigned long x=3;
unsigned long b;
unsigned long c;
void main() //主函
{
b=x*B; //等效 b=x*(2+6),最终运算结果 b 等于 24。因为 3 乘以 8(2 加上 6 等于 8)
c=x*C; //等效 c=x*2+6, 最终运算结 c 等于 12。因为 3 乘以 2 等于 6,6 再加 6 等于 12。
while(1)
{
}
}
上述例子中“有括号”与“没括号”的运算结果差别很大,第一个是 24,第二个是 12。具体的分析已
经在源代码的注释了。
【59.5 #define 在函数上的“一键替换”功能。
#define 的应用很广,也可以应用在函数的“替换”上。例子如下:
void add(void); //函数的声明。
void add(void) //函数的定义。
{
a++;
}
#define a_zi_jia add() //用字符串 a_zi_jia 来替代函数 add()。
unsigned long a=1;
void main() //主函
{
a_zi_jia; //这里相当于调用函数 add()
while(1)
{
}
}
【59.6 #define 在常量后面添加 U 或者 L 的特殊写法。
有些初学者今后可能在工作中遇到#define 以下这种写法: