初级会员

- 积分
- 83
- 金钱
- 83
- 注册时间
- 2015-6-12
- 在线时间
- 14 小时
|
发表于 2017-6-20 03:45:54
|
显示全部楼层
宏 在代码编译前就被替换掉,等效于“复制”-“粘贴”操作。一个经典的例子就是
#define A 1+1
int a = A * 2;
楼主认为 a 的值是多少?
如果你觉得a是4,那就错了。代码在编译前,会复制 1 + 1 这段文字到 A处,所以真正的代码是
int a = 1 + 1 * 2;
这句代码才是被编译的代码,a的值是3.
还有#include语句包含头文件,在编译前也是把头文件的内容复制出来,粘贴到include语句这个地方。
所以楼主的问题,第一次复制粘贴后是
PAout(8) = !PAout(8)
然后PAout(8)也是宏,再次复制粘贴
BIT_ADDR(GPIOA_ODR_Addr,8) = !BIT_ADDR(GPIOA_ODR_Addr,8)
这个也是宏,继续复制粘贴
MEM_ADDR(BITBAND(GPIOA_ODR_Addr, 8)) = !MEM_ADDR(BITBAND(GPIOA_ODR_Addr, 8))
还是宏,继续复制粘贴
*((volatile unsigned long *)(BITBAND(GPIOA_ODR_Addr, 8))) = ! *((volatile unsigned long *)(BITBAND(GPIOA_ODR_Addr, 8)))
还是宏,继续
*((volatile unsigned long *)(((GPIOA_ODR_Addr& 0xF0000000)+0x2000000+((GPIOA_ODR_Addr&0xFFFFF)<<5)+(8<<2)) )) = ! *((volatile unsigned long *)(((GPIOA_ODR_Addr& 0xF0000000)+0x2000000+((GPIOA_ODR_Addr&0xFFFFF)<<5)+(8<<2)) ))
GPIOA_ODR_Addr应该还是宏,你没贴相关代码,我就不粘贴了。
最后那句长长的句子才是真正的代码,你可以复制那句话放到原来的地方,帮编译器省点力气。
现在明白了吗? |
|