Skip to content

double linked list demo 失败 #175

Open
@LIZHICHAOUNICORN

Description

@LIZHICHAOUNICORN

hi,各位:
我的代码环境:g++ 4.8.4, Ubuntu 14.04.6,kernel 4.4.0-148-generic
失败的地方是在 src/double_linked_list_demo.cpp 中的代码:

	list_for_each_prev(pos, &head){
		struct DemoNode * node = list_entry(pos, struct DemoNode, list);
		printf("%d\n", node->key);
	}
	
	list_for_each_entry(node, &head, list){
		printf("%d\n", node->key);
	}

上面demo 示例,list_for_each_prev 中,list_entry中的type 参数是struct DemoNode, 但在 list_for_each_entry 中使用 typeof(*pos) (也就是decltype(*pos) ) , 它返回的type 为 struct DemoNode& , 也就导致编译失败。我做了下面的简单修复.

其中原来的 list_for_each_entry 的实现

#ifndef _MSC_VER
#define list_for_each_entry(pos, head, member)				\
	for (pos = list_entry((head)->next, typeof(*pos), member);	\
	     &pos->member != (head); 					\
	     pos = list_entry(pos->member.next, typeof(*pos), member))
#else
#define list_for_each_entry(pos, head, member)				\
	for (pos = list_entry((head)->next, typeof(pos), member);	\
	     &pos->member != (head); 					\
	     pos = list_entry(pos->member.next, typeof(pos), member))
#endif

修复:

#define list_for_each_entry(pos, head, member)               \
  for (pos = list_entry_ptr((head)->next, typeof(pos), member); \
       &pos->member != (head);                               \
       pos = list_entry_ptr(pos->member.next, typeof(pos), member))

#define list_entry_ptr(ptr, ptrtype, member) \
  (reinterpret_cast<ptrtype>(            \
      (char *)(ptr) - (char *)(&(reinterpret_cast<ptrtype>(1)->member)) + 1))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions