【发布时间】:2011-02-18 16:46:21
【问题描述】:
我目前正在查看我在网上找到的一些源代码,这些源代码以我不理解的方式使用了预处理器宏。它实现了四边数据结构。 希望有人可以为我澄清事情!
typedef int edge_ref;
typedef struct {
edge_ref next[4];
void *data[4];
unsigned mark;
} edge_struct;
#define ROT(e) (((e)&0xfffffffcu)+(((e)+1)&3u))
#define SYM(e) (((e)&0xfffffffcu)+(((e)+2)&3u))
#define TOR(e) (((e)&0xfffffffcu)+(((e)+3)&3u))
#define ONEXT(e) ((edge_struct *)((e)&0xfffffffcu))->next[(e)&3]
#define ROTRNEXT(e) ((edge_struct *)((e)&0xfffffffcu))->next[((e)+1)&3]
#define SYMDNEXT(e) ((edge_struct *)((e)&0xfffffffcu))->next[((e)+2)&3]
#define TORLNEXT(e) ((edge_struct *)((e)&0xfffffffcu))->next[((e)+3)&3]
#define MARK(e) ((edge_struct *)((e)&0xfffffffcu))->mark
这就是它们的使用方式:
edge_ref e;
e = (edge_ref) malloc(sizeof(edge_struct));
ONEXT(e) = e;
SYMDNEXT(e) = SYM(e);
ROTRNEXT(e) = TOR(e);
TORLNEXT(e) = ROT(e);
MARK(e) = 0;
return e;
这只是概述我遇到的问题的摘录。整件事情都可以找到here
【问题讨论】:
-
我的眼睛,流血了。猜猜有人没有告诉开发人员函数和宏之间的区别。去打谁写的,它会让你感觉更好。
-
我认为这是一个非常速度优化的实现
-
是否有一些您不理解的特定内容(例如 edge_struct 指针的位掩码)或者整个事情难以理解?你的问题有点开放式。
-
(((e)&0xfffffffcu)+(((e)+1)&3u)) 我根本不明白.. 什么是 0xfffffffcu 例如
标签: c data-structures macros c-preprocessor binary-operators