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

#define B (2+6) //有括 号 #define C 2+6 //无括号 unsigned l ong x=3; unsigned l ong b; unsigned l ong c; void m ain() //主函 数 { b=x*B; //等效 于 b=x*(2+6),最 终运算结果 b 等于 24。因为 3 乘以 8(2 加上 6 等于 8) 。 c=x*C; //等效 于 c=x*2+6, 最终 运算结 果 c …

100%1 / 836
}
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 以下这种写法:
#define 字符 常量 U
#define 字符 常量 L
具体一点如下:
#define AA 6U
#define BB 6L
常量UL,U 表示 unsigned int;L
表示该常量是长整型 long。但是在实际应用中这样“多此一举”地去强调某个常量的数据类型有什么意义呢?
我自己私下也做了一些测试,目前我本人暂时还没有发现这个秘密的答案。所以对于这个问题,初学者现在
只要知道这种写法在语法上是合法的就可以,至于它背后有什么玄机,有待大家今后更深的发掘。
【59.7 #define 省略常量的特殊写法。
有些初学者今后在多文件编程中,在某些头文件.h 中,会经常遇到以下这类代码:
#ifndef _AAA_
#define _AAA_
#endif
其中 2 代码“#define _AAA_”后面居然没有常量,这样子的写法也行,到底是什么意思?在这类
写法中,当字符串“_AAA_”后面省略了常量的时候,编译器默认会给_AAA_添加一个“非 0”的常量,也
1 或者其它“非 0”的值,多说一句,所谓“ 0”值就是“肯定不是 0。上述代码等效于
#ifndef _AAA_
#define _AAA_ 1 //编译器会在这类默认添加一个 1 或者其它“非 0”的常量
#endif
这个知识点大家只要先有一个感性的认识即可,暂时不用深入了解。
【59.8 例程练习和分析。
现在编一个练习程序来熟悉#define 的用法。
/*---C 语言学习区域的开始。-----------------------------------------------*/
//第 1 个:常量的例子
#define Cu8Level 90 //需要调整“阀值”时,只需更改一次这里的“90”这个数值。
unsigned char a;
unsigned char b;
//第 2 个:运算式的例子
#define C (2+6) //有括号
#define D 2+6 //无括号
unsigned char x=3;