[入门教程] C语言走火入魔,用宏实现crc table

[复制链接]
 楼主| X-Hawk 发表于 2013-9-19 23:11 | 显示全部楼层 |阅读模式
李老师用C++模板实现了一个crc table的例子,
看后觉得过瘾,这水平不是盖的。

但那个是C++写的,为了考虑各位C玩家的感受,
酒鬼想了想,用C语言的宏定义,复刻了一个版本,
同样编译器计算,代码如下(gcc编译验证通过)


  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include "macro_loop.h"

  4. #define CRC_LOOP(n,m)   (((m) >> 1) ^ (-(int32_t)((m) & 1) & 0xEDB88320))
  5. #define CRC(n)          FORA7(CRC_LOOP, (n))

  6. #define CRC_ARRAY(n,m)  m CRC(n),

  7. const static uint32_t crc32tbl[256] = {
  8.     FORB255(CRC_ARRAY, )
  9. };

  10. int main ()
  11. {
  12.     int i;
  13.     for (i = 0; i < 256; i++) {
  14.         printf("%x ", crc32tbl[i]);
  15.     }

  16.     return 0;
  17. }


这个循环和编译器计算的秘密,在macro_loop.h中。
代码很长,附件上传了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ygl968 发表于 2013-9-20 07:22 | 显示全部楼层
缥缈九哥 发表于 2013-9-20 09:21 | 显示全部楼层
顶起。酒鬼高人呀。又方便我们这种C++门外汉。C的初级水平使用者。
乡村男孩 发表于 2013-9-20 11:23 | 显示全部楼层
赞一个 酒鬼高人
呆板书生 发表于 2013-9-20 11:31 | 显示全部楼层
macro_loop.h 太长了,

同样是使用递归
yklstudent 发表于 2013-9-20 17:36 | 显示全部楼层
无语 visual stdio 2008平台下 编译不过去 提示编译器限制宏嵌套太深:shutup:
 楼主| X-Hawk 发表于 2013-9-20 17:39 | 显示全部楼层
本帖最后由 X-Hawk 于 2013-9-20 17:40 编辑
呆板书生 发表于 2013-9-20 11:31
macro_loop.h 太长了,

同样是使用递归

是的。macro_loop.h使用递归制造出循环的效果,

“循环”还是有限制的,以这个macro_loop.h的写法,
“循环”次数不能超过1000,嵌套的“循环”不能超过3个。

有这些限制的原因是,这里面的递归,
不是真正利用C语法支持的,而更像是手工逐次写出来的。

我一度怀疑C语言宏,是否可以像C++模板一样,
C语法能上就能支持递归?
这里Paul同学大概提到了某种可能性,可惜酒鬼没试验出来,也没看懂。
http://stackoverflow.com/questions/12447557/can-we-have-recursive-macros

 楼主| X-Hawk 发表于 2013-9-20 17:55 | 显示全部楼层
yklstudent 发表于 2013-9-20 17:36
无语 visual stdio 2008平台下 编译不过去 提示编译器限制宏嵌套太深

回头想想visual stdio怎么搞,好像不太容易
 楼主| X-Hawk 发表于 2013-9-20 17:56 | 显示全部楼层
其实九哥才是高人,酒鬼这些,都是奇技淫巧
yklstudent 发表于 2013-9-21 09:22 | 显示全部楼层
X-Hawk 发表于 2013-9-20 17:55
回头想想visual stdio怎么搞,好像不太容易

Keil C51下也跑不起来 感觉使用面太窄 没什么实际用处

评论

keil ARM跑撒!  发表于 2013-9-23 21:51
缥缈九哥 发表于 2013-9-21 09:26 | 显示全部楼层
C51,不是真正的C。不要拿它做典型举例了。
wanffeng 发表于 2013-9-24 09:18 | 显示全部楼层
赞!
outstanding 发表于 2013-9-24 09:50 | 显示全部楼层
gbeyond 发表于 2013-9-24 12:28 | 显示全部楼层
小嘿 发表于 2013-9-25 12:44 | 显示全部楼层
crc的多项式有很多种,应该给出多项式参数输入
ke_qh 发表于 2013-9-25 16:24 | 显示全部楼层
路过看了看,学一学,TKS!
zhushengu 发表于 2013-9-26 19:34 | 显示全部楼层
新人,希望能在这里学到东西
jackcms 发表于 2013-9-27 09:55 | 显示全部楼层
jackcms 发表于 2013-9-27 09:56 | 显示全部楼层
赞!
fgdzypf 发表于 2013-9-27 10:26 | 显示全部楼层
高,支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

380

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部