이 경우에 매크로를 쓰는게 더 효율적인건가요?
글쓴이: study / 작성시간: 토, 2022/01/29 - 3:35오후
요즘 여기저기 코드를 보다가 TAILQ 매크로를 알게되었는데요.
queue 구현과 insert/delete/add 등등의 api도 매크로로 구현되어 있는것 같아보이네요
이걸 이렇게 매크로로 구현하는게 효율적일까요?
그냥 일반적인 함수로 구현하는 거에 비해서요.
의견들어보고 싶어서 글 올렸습니다.
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ for ((var) = TAILQ_FIRST((head)); \ (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ (var) = (tvar)) #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for ((var) = TAILQ_LAST((head), headname); \ (var); \ (var) = TAILQ_PREV((var), headname, field)) #define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ for ((var) = TAILQ_LAST((head), headname); \ (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ (var) = (tvar)) #define TAILQ_INIT(head) do { \ TAILQ_FIRST((head)) = NULL; \ (head)->tqh_last = &TAILQ_FIRST((head)); \ QMD_TRACE_HEAD(head); \ } while (0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ TAILQ_NEXT((elm), field)->field.tqe_prev = \ &TAILQ_NEXT((elm), field); \ else { \ (head)->tqh_last = &TAILQ_NEXT((elm), field); \ QMD_TRACE_HEAD(head); \ } \ TAILQ_NEXT((listelm), field) = (elm); \ (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ QMD_TRACE_ELEM(&(elm)->field); \ QMD_TRACE_ELEM(&listelm->field); \ } while (0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ TAILQ_NEXT((elm), field) = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ QMD_TRACE_ELEM(&(elm)->field); \ QMD_TRACE_ELEM(&listelm->field); \ } while (0)
Forums:
field 를 매개 변수로 어떻게 받아야 할 지
field 를 매개 변수로 어떻게 받아야 할 지 함수로 한 번 만들어보세요.
어떻게든 만들었다면 그걸 이용해서 https://kldp.org/files/qqq.c.txt 같은 예제도 한 번 만들어보시고요.
음...그럴까요?
좋은 조언이네요.
시간될 때 한번 만들어볼게요.
그럼 더 비교가 되겠네요 ^^