免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1373 | 回复: 3
打印 上一主题 下一主题

请教一段宏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-12 23:51 |只看该作者 |倒序浏览
这是一段置位操作的宏,写得有点高深


  1. #define bwMCDR2_ADDRESS 4
  2. #define bsMCDR2_ADDRESS 17
  3. #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
  4. #define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
  5. #define SET_BITS(__dst, __bf, __val) \
  6. ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | \
  7. (((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

  8. SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
复制代码


请问
1. bw, bs ,bm 是不是什么关键字,像0x一样?
2. ##在这里有什么用呢

我用gcc -E 得到的结果



  1. #define bwMCDR2_ADDRESS 4
  2. #define bsMCDR2_ADDRESS 17
  3. #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
  4. #define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
  5. #define SET_BITS(__dst, __bf, __val) \
  6. ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | \
  7. (((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

  8. int main()
  9. {

  10.     SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

  11. }
复制代码


  1. int main()
  2. {

  3.     ((MCDR2) = ((MCDR2) & ~((((1U << (4)) - 1) << (17)))) | (((RegisterNumber) << (17)) & ((((1U << (4)) - 1) << (17)))));

  4. }
复制代码

论坛徽章:
5
2 [报告]
发表于 2009-10-13 09:11 |只看该作者
而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系

论坛徽章:
0
3 [报告]
发表于 2009-10-13 09:23 |只看该作者
为什么要将bw与__bf, bs与__bf 连接起来呢,bw, bs有什么在这里特殊含义呢   

(bw ## __bf)  
(bs ## __bf)

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
4 [报告]
发表于 2009-10-13 09:43 |只看该作者
没什么特殊含义
比如fuck_you

我可以这样

define FUCK_FUNC(a,b) a ## b

然后调用

FUCK_FUNC(fuck,_you) 以后会直接变为fuck_you
比如有些函数,你找不到symbol,就是因为这个

这个就是可以让你灵活组合一个函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP