0

List.h 定义了一个名为 list_entry 的宏,它是 container_of() 函数的包装器。一个优雅的函数,看起来很微妙:

考虑这段代码:

tmp = list_entry(pos,(struct Order),ord_Queue);

当我使用 gcc 编译它时,会弹出一个预期表达式的持续错误。

我的结构定义为:

struct Order
        {
         double idNum;
         char* entryTime;
         char* eventTime;
         struct list_head ord_Queue;
        };

当 Arg2 和 Arg3 中使用了多余的括号时,container_of 似乎存在问题,并且此处应该只为 Arg1 提供一个括号。我已经尝试过了,但它不起作用。

一些帮助将不胜感激。

4

2 回答 2

2

我相信您也缺少包含 container_of() 内部使用的“offsetof”宏。尝试包括以下代码(而不是包括整个 list.h。

#include <sys/types.h>
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      \
             const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
             (type *)( (char *)__mptr - offsetof(type,member) );})

#define list_entry(ptr, type, member) \
  container_of(ptr, type, member)

struct list_head {
  struct list_head *next, *prev;
};

并且不需要在第二个参数中添加额外的括号,没有它应该可以正常工作。我希望这应该有效。

于 2011-02-22T09:33:05.950 回答
2

list.h从内核复制它时可能有错误?(假设您在这里做一个用户空间程序。)因为您的示例代码(剥离了一点)确实使用已知良好的实现进行编译。

#include <libHX/list.h>
struct order {
        struct HXlist_head ord_queue;
};
int main(void) {
        struct HXlist_head *pos;
        struct order *o = HXlist_entry(pos, struct order, ord_queue);
}
于 2011-02-14T14:07:28.803 回答