define的坑

宏定义define的用途

普通的define大家肯定都会用,定义常量中的字符串、数值等等,

#define pai 3.141592653

#define name  “abcdef”

也可以用来作程序的分支条件

#ifdef

.... 

#define

...

#endif

平常需要注意的问题就是如果定义中包含表达式的话,那么就需要用()来保证表达式的正确运算,以免优先级混乱


最近做工程的时候碰到一个问题,编写一个动态库时需要用到一个宏定义,但是又希望能在外部修改宏定义的值

左右思量,不太希望添加新的配置文件,于是就有了在编译选项中加入-DAAA=1000的想法,内部代码

#ifndef AAA

#define AAA 2000

#endif

从实用来看AAA是一个静态数组的大小,打印的时候大小也没有问题,但是在调用动态库的过程中,却出现内存紊乱。

纠结了好几天,也没有找到问题的所在,最终解决方法是在调用的程序中也必须加入-DAAA=1000。

具体的内存空间的分配原理还需要细细的分析。


另外附上如果想在调试过程中查看宏定义的值,可以加上编译条件 -gdwarf-2 -g3




/** @brief I2C address to be used for ST25DV Data accesses. */ #define ST25DV_ADDR_DATA_I2C 0xA6 #define ST25DV_ADDR_DATA_W_I2C 0xA6 #define ST25DV_ADDR_DATA_R_I2C 0xA7 /** @brief I2C address to be used for ST25DV System accesses. */ #define ST25DV_ADDR_SYST_I2C 0xAE #define ST25DV_ADDR_SYST_W_I2C 0xAE #define ST25DV_ADDR_SYST_R_I2C 0xAF /* Registers i2c address */ /** @brief ST25DV GPO register address. */ #define ST25DV_GPO_REG 0x0000 /** @brief ST25DV IT duration register address. */ #define ST25DV_ITTIME_REG 0x0001 /** @brief ST25DV Energy Harvesting register address. */ #define ST25DV_EH_MODE_REG 0x0002 /** @brief ST25DV RF management register address. */ #define ST25DV_RF_MNGT_REG 0x0003 /** @brief ST25DV Area 1 security register address. */ #define ST25DV_RFA1SS_REG 0x0004 /** @brief ST25DV Area 1 end address register address. */ #define ST25DV_ENDA1_REG 0x0005 /** @brief ST25DV Area 2 security register address. */ #define ST25DV_RFA2SS_REG 0x0006 /** @brief ST25DV Area 2 end address register address. */ #define ST25DV_ENDA2_REG 0x0007 /** @brief ST25DV Area 3 security register address. */ #define ST25DV_RFA3SS_REG 0x0008 /** @brief ST25DV Area 3 end address register address. */ #define ST25DV_ENDA3_REG 0x0009 /** @brief ST25DV Area 4 security register address. */ #define ST25DV_RFA4SS_REG 0x000A /** @brief ST25DV I2C security register address. */ #define ST25DV_I2CSS_REG 0x000B /** @brief ST25DV Capability Container lock register address. */ #define ST25DV_LOCKCCFILE_REG 0x000C /** @brief ST25DV Mailbox mode register address. */ #define ST25DV_MB_MODE_REG 0x000D /** @brief ST25DV Mailbox Watchdog register address. */ #define ST25DV_MB_WDG_REG 0x000E /** @brief ST25DV Configuration lock register address. */ #define ST25DV_LOCKCFG_REG 0x000F /** @brief ST25DV DSFID lock register address. */ #define ST25DV_LOCKDSFID_REG 0x0010 /** @brief ST25DV AFI lock register address. */ #define ST25DV_LOCKAFI_REG 0x0011 /** @brief ST25DV DSFID register address. */ #define ST25DV_DSFID_REG 0x0012 /** @brief ST25DV AFI register address. */ #define ST25DV_AFI_REG 0x0013 /** @brief ST25DV Memory size register address. */ #define ST25DV_MEM_SIZE_LSB_REG 0x0014 /** @brief ST25DV Memory size register address. */ #define ST25DV_MEM_SIZE_MSB_REG 0x0015 /** @brief ST25DV Block size register address. */ #define ST25DV_BLK_SIZE_REG 0x0016 //** @brief ST25DV ICref register address. */ #define ST25DV_ICREF_REG 0x0017 /** @brief ST25DV UID register address. */ #define ST25DV_UID_REG 0x0018 /** @brief ST25DV IC revision register address. */ #define ST25DV_ICREV_REG 0x0020 /** @brief ST25DV I2C password register address. */ #define ST25DV_I2CPASSWD_REG 0x0900 /* Dynamic Registers i2c address */ /** @brief ST25DV GPO dynamic register address. */ #define ST25DV_GPO_DYN_REG 0x2000 /** @brief ST25DV Energy Harvesting control dynamic register address. */ #define ST25DV_EH_CTRL_DYN_REG 0x2002 /** @brief ST25DV RF management dynamic register address. */ #define ST25DV_RF_MNGT_DYN_REG 0x2003 /** @brief ST25DV I2C secure session opened dynamic register address. */ #define ST25DV_I2C_SSO_DYN_REG 0x2004 /** @brief ST25DV Interrupt status dynamic register address. */ #define ST25DV_ITSTS_DYN_REG 0x2005 /** @brief ST25DV Mailbox control dynamic register address. */ #define ST25DV_MB_CTRL_DYN_REG 0x2006 /** @brief ST25DV Mailbox message length dynamic register address. */ #define ST25DV_MBLEN_DYN_REG 0x2007 /** @brief ST25DV Mailbox buffer address. */ #define ST25DV_MAILBOX_RAM_REG 0x2008 /* GPO */ #define ST25DV_GPO_RFUSERSTATE_SHIFT (0) #define ST25DV_GPO_RFUSERSTATE_FIELD 0xFE #define ST25DV_GPO_RFUSERSTATE_MASK 0x01 #define ST25DV_GPO_RFACTIVITY_SHIFT (1) #define ST25DV_GPO_RFACTIVITY_FIELD 0xFD #define ST25DV_GPO_RFACTIVITY_MASK 0x02 #define ST25DV_GPO_RFINTERRUPT_SHIFT (2) #define ST25DV_GPO_RFINTERRUPT_FIELD 0xFB #define ST25DV_GPO_RFINTERRUPT_MASK 0x04 #define ST25DV_GPO_FIELDCHANGE_SHIFT (3) #define ST25DV_GPO_FIELDCHANGE_FIELD 0xF7 #define ST25DV_GPO_FIELDCHANGE_MASK 0x08 #define ST25DV_GPO_RFPUTMSG_SHIFT (4) #define ST25DV_GPO_RFPUTMSG_FIELD 0xEF #define ST25DV_GPO_RFPUTMSG_MASK 0x10 #define ST25DV_GPO_RFGETMSG_SHIFT (5) #define ST25DV_GPO_RFGETMSG_FIELD 0xDF #define ST25DV_GPO_RFGETMSG_MASK 0x20 #define ST25DV_GPO_RFWRITE_SHIFT (6) #define ST25DV_GPO_RFWRITE_FIELD 0xBF #define ST25DV_GPO_RFWRITE_MASK 0x40 #define ST25DV_GPO_ENABLE_SHIFT (7) #define ST25DV_GPO_ENABLE_FIELD 0x7F #define ST25DV_GPO_ENABLE_MASK 0x80 #define ST25DV_GPO_ALL_MASK 0xFF /* GPO_Dyn */ #define ST25DV_GPO_DYN_RFUSERSTATE_SHIFT (0) #define ST25DV_GPO_DYN_RFUSERSTATE_FIELD 0xFE #define ST25DV_GPO_DYN_RFUSERSTATE_MASK 0x01 #define ST25DV_GPO_DYN_RFACTIVITY_SHIFT (1) #define ST25DV_GPO_DYN_RFACTIVITY_FIELD 0xFD #define ST25DV_GPO_DYN_RFACTIVITY_MASK 0x02 #define ST25DV_GPO_DYN_RFINTERRUPT_SHIFT (2) #define ST25DV_GPO_DYN_RFINTERRUPT_FIELD 0xFB #define ST25DV_GPO_DYN_RFINTERRUPT_MASK 0x04 #define ST25DV_GPO_DYN_FIELDCHANGE_SHIFT (3) #define ST25DV_GPO_DYN_FIELDCHANGE_FIELD 0xF7 #define ST25DV_GPO_DYN_FIELDCHANGE_MASK 0x08 #define ST25DV_GPO_DYN_RFPUTMSG_SHIFT (4) #define ST25DV_GPO_DYN_RFPUTMSG_FIELD 0xEF #define ST25DV_GPO_DYN_RFPUTMSG_MASK 0x10 #define ST25DV_GPO_DYN_RFGETMSG_SHIFT (5) #define ST25DV_GPO_DYN_RFGETMSG_FIELD 0xDF #define ST25DV_GPO_DYN_RFGETMSG_MASK 0x20 #define ST25DV_GPO_DYN_RFWRITE_SHIFT (6) #define ST25DV_GPO_DYN_RFWRITE_FIELD 0xBF #define ST25DV_GPO_DYN_RFWRITE_MASK 0x40 #define ST25DV_GPO_DYN_ENABLE_SHIFT (7) #define ST25DV_GPO_DYN_ENABLE_FIELD 0x7F #define ST25DV_GPO_DYN_ENABLE_MASK 0x80 #define ST25DV_GPO_DYN_ALL_MASK 0xFF /* ITTIME */ #define ST25DV_ITTIME_DELAY_SHIFT (0) #define ST25DV_ITTIME_DELAY_FIELD 0xFC #define ST25DV_ITTIME_DELAY_MASK 0x03 /* ITSTS_Dyn */ #define ST25DV_ITSTS_RFUSERSTATE_SHIFT (0) #define ST25DV_ITSTS_RFUSERSTATE_FIELD 0xFE #define ST25DV_ITSTS_RFUSERSTATE_MASK 0x01 #define ST25DV_ITSTS_RFACTIVITY_SHIFT (1) #define ST25DV_ITSTS_RFACTIVITY_FIELD 0xFD #define ST25DV_ITSTS_RFACTIVITY_MASK 0x02 #define ST25DV_ITSTS_RFINTERRUPT_SHIFT (2) #define ST25DV_ITSTS_RFINTERRUPT_FIELD 0xFB #define ST25DV_ITSTS_RFINTERRUPT_MASK 0x04 #define ST25DV_ITSTS_FIELDFALLING_SHIFT (3) #define ST25DV_ITSTS_FIELDFALLING_FIELD 0xF7 #define ST25DV_ITSTS_FIELDFALLING_MASK 0x08 #define ST25DV_ITSTS_FIELDRISING_SHIFT (4) #define ST25DV_ITSTS_FIELDRISING_FIELD 0xEF #define ST25DV_ITSTS_FIELDRISING_MASK 0x10 #define ST25DV_ITSTS_RFPUTMSG_SHIFT (5) #define ST25DV_ITSTS_RFPUTMSG_FIELD 0xDF #define ST25DV_ITSTS_RFPUTMSG_MASK 0x20 #define ST25DV_ITSTS_RFGETMSG_SHIFT (6) #define ST25DV_ITSTS_RFGETMSG_FIELD 0xBF #define ST25DV_ITSTS_RFGETMSG_MASK 0x40 #define ST25DV_ITSTS_RFWRITE_SHIFT (7) #define ST25DV_ITSTS_RFWRITE_FIELD 0x7F 解释下这些宏定义
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值