关于宏定义的计算问题

宏定义分厂好用,我也经常用

但是呢,宏定义也有一些缺点
比如呢,这里给出一个简单的宏定义

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编译器会帮我把数自动计算好

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值