宏定义分厂好用,我也经常用
但是呢,宏定义也有一些缺点
比如呢,这里给出一个简单的宏定义
define A ((((1*2)+3)*4)+5)
假如在程序中用呢,就是
uint32_t data = A;
宏定义就是简单的替换
所以呢就变成了
uint32_t data = ((((1*2)+3)*4)+5);
其实最终呢咱们想要的是
data = 25;
但是假如编译器不干任何事情的话
那么本来一个简单的赋值操作就被搞成了 两个乘法 两个加法 最后由一个赋值
所以你应该先干一件事
了解你的编译器,看一下编译器会不会直接给你计算出来,
经过测试呢,我经常用的KEIL编译器,确实把这些东西都给做好了
但是,假如你不是的话呢,那你就要自己看一下,你的编译器了
下面说一下我的测试方法
写一个函数
调用这个函数
然后,看一下这个函数编译成汇编是什么
比如呢
void test(void)
{
float angle = 0.0f;
uint32_t test = 0;
#define PI ((float)3.1415926535898f)
/* 弧度到角度(计算方法:180 / π) */
#define RadianToAngle ((float)(180.0f) / PI)
/* 角度到弧度(计算方法: π / 180) */
#define AngleToRadian ((float)(PI / 180.0f))
angle = 3.1415926;
#define DATA0 (((1*2)+3)+4)
test = DATA0;
}
这条C语言代码对应的汇编代码为
test = DATA0;
MOVS r0,#0x19;
所以证明了KEIL编译器会帮我把数自动计算好