在线课堂:https://www.100ask.net/index(课程观看) 论 坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taobao.com/ (淘宝) https://weidongshan.tmall.com/(天猫) 交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载) 交流群二:QQ群:536785813(单片机-嵌入式) 公 众 号:百问科技
版本日期作者说明V12020杨树技术文档一,宏的定义与撤销
#普通宏定义
#define PI 3.14 //编译阶段替换掉宏
#define T1 3+4 //容易产生歧义
#define T2 (3+4) //添加括号后,语义清楚
float r = 1.0;
float area = PI * r * r;
int a = 2* T1 #宏替换后变成 int a = 2*3+4 不符合本意
ing a = 2* T2 #红替换后变成 int a = 2*(3+4) 符合本意
#undef PI
float area = PI * r * r; #error: ‘PI’ was not declared in this scope
//引号中的宏定义不会被替换
printf("%s:%f\n", "PI", PI); //输出 PI:3.14
//宏定义的名字必须是合法标识符
#define 0x abcd //error 不能以数字开始
//宏定义中双引号和单引号必须成对出现
#define TEST11 "Z //error
#define TEST2 'Z //error
二、带有参数的宏定义
//max和min的宏定义带参数
#define MAX(a,b) (a>b ? a:b)
#define MIN(a,b) (a2 ? 1:2) + (1 field )
- 得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
- 得到一个变量的地址(word宽度)
#define B_PTR( var ) ( (byte *) (void *) &(var) )
#define W_PTR( var ) ( (word *) (void *) &(var) )
- 将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) = '0' && (c) = '0' && (c) = 'A' && (c) = 'a' && (c) (val)) ? (val)+1 : (val))
- 返回数组元素的个数
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )