0

List.hは、container_of()関数のラッパーであるlist_entryと呼ばれるマクロを定義します。非常に繊細に見えるエレガントな機能:

このコードを考えてみましょう。

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専用のブラケットが1つあるはずです。試しましたが、うまくいきません。

いくつかの助けをいただければ幸いです。

4

2 に答える 2

2

内部で container_of() によって使用される「offsetof」マクロも含まれていないと思います。次のコードを含めてみてください (list.h.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;
};

また、2 番目の引数に余分な括弧を追加する必要はありません。それがなくても問題なく動作するはずです。これがうまくいくことを願っています。

于 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 に答える