免费注册 查看新帖 |

Chinaunix

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

能看得出这几个宏是什么功能么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-14 16:46 |只看该作者 |倒序浏览
#define int4store(T,A)       do { *((char *)(T))=(char) ((A));\
                                  *(((char *)(T))+1)=(char) (((A) >> 8));\
                                  *(((char *)(T))+2)=(char) (((A) >> 16));\
                                  *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0)
#define int5store(T,A)       do { *((char *)(T))=     (char)((A));  \
                                  *(((char *)(T))+1)= (char)(((A) >> 8)); \
                                  *(((char *)(T))+2)= (char)(((A) >> 16)); \
                                  *(((char *)(T))+3)= (char)(((A) >> 24)); \
                                  *(((char *)(T))+4)= (char)(((A) >> 32)); \
                                } while(0)
#define int6store(T,A)       do { *((char *)(T))=     (char)((A)); \
                                  *(((char *)(T))+1)= (char)(((A) >> 8)); \
                                  *(((char *)(T))+2)= (char)(((A) >> 16)); \
                                  *(((char *)(T))+3)= (char)(((A) >> 24)); \
                                  *(((char *)(T))+4)= (char)(((A) >> 32)); \
                                  *(((char *)(T))+5)= (char)(((A) >> 40)); \
                                } while(0)
//////////////////////////////////////////////////////////////////////////////////////////////////

#define uint4korr(A)        (uint32) (((uint32) ((uchar) (A)[0])) +\
                                  (((uint32) ((uchar) (A)[1])) << 8) +\
                                  (((uint32) ((uchar) (A)[2])) << 16) +\
                                  (((uint32) ((uchar) (A)[3])) << 24))
#define uint5korr(A)        ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
                                    (((uint32) ((uchar) (A)[1])) << 8) +\
                                    (((uint32) ((uchar) (A)[2])) << 16) +\
                                    (((uint32) ((uchar) (A)[3])) << 24)) +\
                                    (((ulonglong) ((uchar) (A)[4])) << 32))
#define uint6korr(A)        ((ulonglong)(((uint32)    ((uchar) (A)[0]))          + \
                                     (((uint32)    ((uchar) (A)[1])) << 8)   + \
                                     (((uint32)    ((uchar) (A)[2])) << 16)  + \
                                     (((uint32)    ((uchar) (A)[3])) << 24)) + \
                         (((ulonglong) ((uchar) (A)[4])) << 32) +       \
                         (((ulonglong) ((uchar) (A)[5])) << 40))
///////////////////////////////////////////////////////////////////////////////////////////////////////////

#define float4store(T,A) do { *(T)= ((uchar *) &A)[3];\
                              *((T)+1)=(char) ((uchar *) &A)[2];\
                              *((T)+2)=(char) ((uchar *) &A)[1];\
                              *((T)+3)=(char) ((uchar *) &A)[0]; } while(0)

#define float4get(V,M)   do { float def_temp;\
                              ((uchar*) &def_temp)[0]=(M)[3];\
                              ((uchar*) &def_temp)[1]=(M)[2];\
                              ((uchar*) &def_temp)[2]=(M)[1];\
                              ((uchar*) &def_temp)[3]=(M)[0];\
                              (V)=def_temp; } while(0)

难道和大小端有关?

论坛徽章:
0
2 [报告]
发表于 2008-12-14 17:36 |只看该作者
问一下作者,呵呵

论坛徽章:
0
3 [报告]
发表于 2008-12-14 19:11 |只看该作者
前面几个是转换字节序吧

论坛徽章:
0
4 [报告]
发表于 2008-12-14 19:47 |只看该作者
大概意思就是一个一个字节拆开某种类型

在现在的机器环境下,定义成宏而不是函数,不知道怎么想的,函数调用的开销几乎可以忽略。。

论坛徽章:
0
5 [报告]
发表于 2008-12-14 19:54 |只看该作者

回复 #1 scut_tang 的帖子

do{}while(0)这个是为了好看么?

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
6 [报告]
发表于 2008-12-14 20:01 |只看该作者
原帖由 雨过白鹭洲 于 2008-12-14 19:47 发表
大概意思就是一个一个字节拆开某种类型

在现在的机器环境下,定义成宏而不是函数,不知道怎么想的,函数调用的开销几乎可以忽略。。


比较赞同cugb_cat的观点,

有一点比较奇怪,那个 ***5***的宏,莫非,它们的接口定义的时候,用5byte传一个整形值?感觉比较费解;

论坛徽章:
0
7 [报告]
发表于 2008-12-14 21:05 |只看该作者
宏就是垃圾,这么用宏的就是傻瓜,孔乙己。

论坛徽章:
0
8 [报告]
发表于 2008-12-14 21:45 |只看该作者
宏的好处是可以使用任何类型来替换,结合模板使用,非常高深。

论坛徽章:
0
9 [报告]
发表于 2008-12-14 22:23 |只看该作者
原帖由 FuriousFive 于 2008-12-14 21:45 发表
宏的好处是可以使用任何类型来替换,结合模板使用,非常高深。

恩,C中用宏模拟C++的模板比较好。

论坛徽章:
0
10 [报告]
发表于 2008-12-15 10:04 |只看该作者

很简单

不就是将基本数据类型(int,uint,float)串行化为一个字符数组吗?应该还有一组"反串行化"的宏,比如,float4get(V,M)就是将一个字符数组的中存储的一个float值转换为float类型的宏;这应该是网络或者存储程序的一段代码。
宏和模板是各有千秋的,不能说谁比谁好,宏虽然好,但宏的副作用也是很大的;模板相对宏来说,有了很多限制,但是它就比宏安全多了。总的来说,是药三分毒,适合自己的就是最好的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP