이 경우에 매크로를 쓰는게 더 효율적인건가요?

study의 이미지

요즘 여기저기 코드를 보다가 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)
bushi의 이미지

field 를 매개 변수로 어떻게 받아야 할 지 함수로 한 번 만들어보세요.
어떻게든 만들었다면 그걸 이용해서 https://kldp.org/files/qqq.c.txt 같은 예제도 한 번 만들어보시고요.

study의 이미지

좋은 조언이네요.
시간될 때 한번 만들어볼게요.
그럼 더 비교가 되겠네요 ^^