打印
[入门教程]

C语言走火入魔,用宏实现crc table

[复制链接]
7898|42
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
X-Hawk|  楼主 | 2013-9-19 23:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
李老师用C++模板实现了一个crc table的例子,
看后觉得过瘾,这水平不是盖的。

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


#include <stdint.h>
#include <stdio.h>
#include "macro_loop.h"

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

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

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

int main ()
{
    int i;
    for (i = 0; i < 256; i++) {
        printf("%x ", crc32tbl[i]);
    }

    return 0;
}


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



macro_loop.zip

17.63 KB

相关帖子

沙发
ygl968| | 2013-9-20 07:22 | 只看该作者

使用特权

评论回复
板凳
缥缈九哥| | 2013-9-20 09:21 | 只看该作者
顶起。酒鬼高人呀。又方便我们这种C++门外汉。C的初级水平使用者。

使用特权

评论回复
地板
乡村男孩| | 2013-9-20 11:23 | 只看该作者
赞一个 酒鬼高人

使用特权

评论回复
5
呆板书生| | 2013-9-20 11:31 | 只看该作者
macro_loop.h 太长了,

同样是使用递归

使用特权

评论回复
6
yklstudent| | 2013-9-20 17:36 | 只看该作者
无语 visual stdio 2008平台下 编译不过去 提示编译器限制宏嵌套太深:shutup:

使用特权

评论回复
7
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

使用特权

评论回复
8
X-Hawk|  楼主 | 2013-9-20 17:55 | 只看该作者
yklstudent 发表于 2013-9-20 17:36
无语 visual stdio 2008平台下 编译不过去 提示编译器限制宏嵌套太深

回头想想visual stdio怎么搞,好像不太容易

使用特权

评论回复
9
X-Hawk|  楼主 | 2013-9-20 17:56 | 只看该作者
其实九哥才是高人,酒鬼这些,都是奇技淫巧

使用特权

评论回复
10
yklstudent| | 2013-9-21 09:22 | 只看该作者
X-Hawk 发表于 2013-9-20 17:55
回头想想visual stdio怎么搞,好像不太容易

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

使用特权

评论回复
评论
dong_abc 2013-9-23 21:51 回复TA
keil ARM跑撒! 
11
缥缈九哥| | 2013-9-21 09:26 | 只看该作者
C51,不是真正的C。不要拿它做典型举例了。

使用特权

评论回复
12
wanffeng| | 2013-9-24 09:18 | 只看该作者
赞!

使用特权

评论回复
13
outstanding| | 2013-9-24 09:50 | 只看该作者

使用特权

评论回复
14
gbeyond| | 2013-9-24 12:28 | 只看该作者

使用特权

评论回复
15
小嘿| | 2013-9-25 12:44 | 只看该作者
crc的多项式有很多种,应该给出多项式参数输入

使用特权

评论回复
16
ke_qh| | 2013-9-25 16:24 | 只看该作者
路过看了看,学一学,TKS!

使用特权

评论回复
17
zhushengu| | 2013-9-26 19:34 | 只看该作者
新人,希望能在这里学到东西

使用特权

评论回复
18
jackcms| | 2013-9-27 09:55 | 只看该作者

使用特权

评论回复
19
jackcms| | 2013-9-27 09:56 | 只看该作者
赞!

使用特权

评论回复
20
fgdzypf| | 2013-9-27 10:26 | 只看该作者
高,支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

380

帖子

3

粉丝