Я в настоящее время просматриваю какой-то исходный код, который я нашел в сети, который использует макросы препроцессора таким образом, что я не понимаю. Он реализует четырехъядерную структуру данных. Надеюсь, что кто-то может прояснить мне все!Макросы препроцессора Не понимаю
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
мои глаза, они истекают кровью. Угадайте, что кто-то не сказал этому разработчику разницу между функциями и макросами. Пойдите, удалите того, кто написал это, это заставит вас чувствовать себя лучше. – wheaties
Я думаю, что это очень оптимизированная по скорости реализация. – guest
Есть ли что-то конкретное, что вы не понимаете (например, маскирование символов указателя edge_struct) или все это непостижимо? Ваш вопрос немного открыт. –