在编写代码时,常常会使用 宏定义 将 常量 通过英文替代。如,单片机的头文件中就有如下宏定义:
#define GPIO_MODER_MODE2_Pos (4U)
#define GPIO_MODER_MODE2_Msk (0x3UL << GPIO_MODER_MODE2_Pos) /*!< 0x00000030 */
#define GPIO_MODER_MODE2 GPIO_MODER_MODE2_Msk
#define GPIO_MODER_MODE2_0 (0x1UL << GPIO_MODER_MODE2_Pos) /*!< 0x00000010 */
#define GPIO_MODER_MODE2_1 (0x2UL << GPIO_MODER_MODE2_Pos) /*!< 0x00000020 */
问题:
#define GPIO_MODER_MODE2_Pos (第一行的宏定义) 没有异议,使用这个宏定义就直接使用了,
如果使用 GPIO_MODER_MODE2(第三行的宏定义),单片机是否要计算移位呢?
先说结果:不需要,编译器会直接优化
验证如下
下面是宏定义对16进制的验证:
下面是对浮点型计算的验证:
困扰我的问题今天验证了,给大家一个参考。
因此大家可以放心的使用宏定义了,不需要考虑将这些常量先计算过后再宏定义,编译器会帮我们进行计算,不需要的消耗单片机的资源了。