#define有哪些缺陷

宏定义在预处理阶段进行,主要做的是字符替换工作,所以它存在着一些固有的缺陷

  1. 它无法进行类型检查。宏定义是在编译前进行字符的替换,因为还没有编译,不能编译前就检查好类型是否匹配,而只能在编译时才知道,所以不具备类型检查功能。
  2. 由于优先级的不同,使用宏定义时,可能会存在副作用,如,执行加法操作的宏定义运算#define ADD(a + b) a + b在使用的过程中,对于表达式的运算就可能存在潜在的问题,而应该改为 #define ADD(a + b) ((a) + (b)).
  3. 无法单步调试。
  4. 会导致代码膨胀。由于宏定义是文件替换,需要对代码进行展开,相比较函数调用的方式,会存在较多的冗余代码。
  5. 在C++中,使用宏无法操作类的私有数据成员 
现在要做一个物联网项目: 1.多设备和网关设备通信,有低功耗设备。 2.网关使用esp8266和nrf24l01,设备使用stm8或者py32作为主控和nrf24l01。 3.设备第一次接入网关时,需要认证,然后由网关向设备分发设备通讯地址,设备正常时处于监听状态。由于nrf24l01通讯方式,设备或网关要向对方发送数据时需先将本身地址切换到对方地址。 3.网关正常处于监听状态。非低功耗设备定期向网关心跳。 4.设备有开关,灯,温湿度传感器等。 设计一个固定帧长为32字节的通讯协议,包含加密和防重放功能,包含1字节的源id和目标id,版本号。注意无法实现时间戳,因为部分设备为低功耗设备,不具备时间功能。 协议中功能字要有动作执行,读写等功能。可以下内容,可以改进。 /* * 各属性字节长度 */ #define IDENTIFI_ID_LEN 1 //辨识码长度 uint8 #define DEVICE_ID_LEN 12 #define ADDRESS_LEN 6 #define PASSWORD_LEN 8 #define AUTHORIZATION_CODE_LEN 12 #define PUBLIC_IDENTIFY_ID 0xff #define PUBLIC_ADDRESS {0x4a,0x7f,0xc7,0xb9,0x3a,0x58} #define GATEWAY_IID 0x01 //网关iid 1 #define REMOTE_IID 0x02 //遥控iid 2 #define DEVICE_IID_START 0x03 //给设备分配的起始iid #define BROADCAST_IID 0xff //广播的目的地址,仅用于注册 /*------------------- 动作码 -----------------------*/ /* * 动作码为1个字节(0xff) * 用于设备属性读写、注册、心跳、升级、错误反馈等动作 */ //基本动作 #define PROTOCOL_READ_ATTR 0x01 //读取属性值 #define PROTOCOL_WRITE_ATTR 0x02 //写属性值 #define PROTOCOL_RESPONSE 0x03 //回复 //其他动作 #define PROTOCOL_BROADCAST 0x05 //网关/设备地址广播 - //附:设备iid,设备地址,网关地址,通讯密码 #define PROTOCOL_REGISTER 0x06 //设备注册 - 附:设备地址,设备类型,设备已发送帧计数,设备id字符串 #define PROTOCOL_PING 0x07 //心跳包 #define PROTOCOL_UPGRADE 0x08 //升级 #define PROTOCOL_RESET 0x09 //解绑(重置设备) #define PROTOCOL_DEL_DEVICE 0x10 //删除设备,附:设备id字符串 //云端下发PROTOCOL_DEL_DEVICE后,网关反馈PROTOCOL_DEL_DEVICE,再删除 #define PROTOCOL_REMOTE_SIGNAL 0x20 //遥控使用 #define PROTOCOL_ADJUST_UP_BRIGHTNESS 0x22 #define PROTOCOL_ADJUST_DOWN_BRIGHTNESS 0x23 #define PROTOCOL_ADJUST_UP_TEMPERATURE 0x24 #define PROTOCOL_ADJUST_DOWN_TEMPERATURE 0x25 #define PROTOCOL_ADJUST_UP_WINDSPEED 0x26 #define PROTOCOL_ADJUST_DOWN_WINDSPEED 0x27 #define PROTOCOL_ADJUST_UP_VOLUME 0x28 #define PROTOCOL_ADJUST_DOWN_VOLUME 0x29 #define PROTOCOL_TURN_ON 0x30 #define PROTOCOL_TURN_OFF 0x31 //#define PROTOCOL_COUNT_CLEAR 0x09 //消息计数器请求清零 //(用于消息发送计数将要达到最大值时,清零重新开始计数) /*------------------- 动作码 -----------------------*/ /*--------------------- 属性码 (0-0x3f)---------------------*/ #define PROTOCOL_IDENTIFY_ID 0x09 //局域设备辨识符(由网关/主设备分配) #define PROTOCOL_REG_FLAG 0x10 //设备注册标志 #define PROTOCOL_PASSWORD 0x12 //w,设备通信加密密码,一个网关下设备使用同一密码 #define PROTOCOL_DEVICEID 0x13 //r,设备ID #define PROTOCOL_AUTHORIZATION_CODE 0x14 //r,设备授权码 #define PROTOCOL_SELF_ADDRESS 0x15 //rw,设备24L01地址 #define PROTOCOL_GATE_ADDRESS 0x16 //w,网关24L01地址 #define PROTOCOL_FIRST_TIME_POWERON 0x17 //r,设备第一次上电时间 #define PROTOCOL_LAST_TIME_POWERON 0x18 //r,设备最后一次上电时间 #define PROTOCOL_POWERON_TIMES 0x19 //r,设备上电次数 #define PROTOCOL_MASTER_ADDRESS PROTOCOL_GATE_ADDRESS //w,名字不同 #define PROTOCOL_POWERSTATE 0x1A //rw,电源状态 #define PROTOCOL_COLOR 0x1B //rw,颜色 #define PROTOCOL_TEMPERATURE 0x1C //rw,温度 #define PROTOCOL_WINDSPEED 0x1D //rw,风速 #define PROTOCOL_BRIGHTNESS 0x1E //r,亮度 #define PROTOCOL_HUMIDITY 0x1F //r,湿度 //#define PROTOCOL_CHANNEL 0x20 //w,电视频道 //#define PROTOCOL_NUMBER 0x21 //w,电视频道号 #define PROTOCOL_DIRECTION 0x22 //方向 #define PROTOCOL_ANGLE 0x23 //角度 #define PROTOCOL_MODE 0x24 //模式 #define PROTOCOL_VOLUME 0x29 //音量 #define PROTOCOL_LEFTTIME 0x25 //剩余时间 #define PROTOCOL_REMOTESTATUS 0x26 //r,设备远程状态 #define PROTOCOL_ONLINESTATE 0x27 //r,设备在线状态 #define PROTOCOL_COLORTEMPERATURE 0x28 //色温 #define PROTOCOL_BRIGHT_CALIBRATION 0x29 #define PROTOCOL_TEMP_CALIBRATION 0x30 #define PROTOCOL_PRODUCE_TIME 0x31 #define PROTOCOL_FIRMWARE 0x33 #define PROTOCOL_TEMP_BRIGHT 0x34 #define PROTOCOL_ADC_READ_CYCLE 0x35 #define PROTOCOL_TIME 0x36 /*--------------------- 属性码 ---------------------*/ /********************************** ^ 功能码 ^ ********************************/ //属性值和数值型值都是数字类型,因此值类型只设两种,即:数值int32,数组。 /******************** 属性值 ********************/ #define PROTOCOL_VALUE_ON 0x01 #define PROTOCOL_VALUE_OFF 0x00 #define PROTOCOL_VALUE_MIN 0x04 #define PROTOCOL_VALUE_MAX 0x05 /*----!暂时未使用--- COLOR ----*/ #define PROTOCOL_VALUE_RED 0x01 #define PROTOCOL_VALUE_YELLOW 0x02 #define PROTOCOL_VALUE_BLUE 0x03 #define PROTOCOL_VALUE_GREEN 0x04 #define PROTOCOL_VALUE_WHITE 0x05 #define PROTOCOL_VALUE_BLACK 0x06 #define PROTOCOL_VALUE_CYAN 0x07 #define PROTOCOL_VALUE_PURPLE 0x08 #define PROTOCOL_VALUE_ORANGE 0x09 /****************** ^ 属性值 ^ ******************/ #define PROTOCOL_NOTHING 0xff // #define PROTOCOL_MODE_REGISTERED 0x33 // #define PROTOCOL_MODE_NORMAL 0x66 // #define PROTOCOL_MODE_RESET 0x88 // #endif /***** END OF FILE *****/
最新发布
12-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值