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

#define 字符 串 常量 U #define 字符 串 常量 L 具体一点如 下: #define AA 6 U #define BB 6 L 常量 加 后 缀 “ U ” 或 者 “ L ” 有 什 么 含 义 呢 ? 字 面 上 理 解 ,U 表示 该 常 量 是 无 符 号 整 型 unsigned in t;L 表示该常量 是长整型 long。 但是在实际应 用中这样 “多此一举” 地去强调某个 常量的数据 类型有什么意 …

100%1 / 836
#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;
unsigned char c;
unsigned char d;
//第 3 个:函数的例子
unsigned char e=1;
void add(void);
void add(void)
{
e++;
}
#define a_zi_jia add() //用字符串 a_zi_jia 来替代函数 add()。
void main() //主函数
{
//第 1 个:常量的例子
if(89>=Cu8Level) //大于或者等于阀值,就输 1。
{
a=1;
}
else //否则输出 0。
{
a=0;
}
if(95>=Cu8Level) //大于或者等于阀值,就输 1。
{
b=1;
}
else //否则输出 0。
{
b=0;
}
//第 2 个:运算式的例子
c=x*C; //等效于 c=x*(2+6),最终运算结果 c 等于 24。因 3 乘以 8(2 加上 6 等于 8)
d=x*D; //等效于 d=x*2+6, 最终运算结 d 等于 12。因为 3 乘以 2 等于 6,6 再加 6 等于 12。
//第 3 个:函数的例子
a_zi_jia; //这里相当于调用函数 add()。e 1 自加 2
a_zi_jia; //这里相当于调用函数 add()。e 2 自加 3