1

Linux Kernel Linked List 実装を使用しようとしていますが、コンパイルできません。これらのソースを正確にフォローしていますが、結果はありません(http://www.roman10.net/linux-kernel-programminglinked-list/およびhttp://kernelnewbies.org/FAQ/LinkedLists

LIST_HEAD_INIT の list.h カーネル マクロは次のとおりです。

#define LIST_HEAD_INIT(name) { &(name), &(name) }


struct Node {
int data;
struct list_head list;
};

struct Node mylinkedlist;
LIST_HEAD_INIT(&mylinkedlist.list);    

void add(){
struct Node first;
first.data = 1;
first.list = LIST_HEAD_INIT(first.list);
list_add_tail(&first->list, &mylinkedlist.list);
return 0;
}

「エラー: '{' の前に識別子または '(' が必要です」

4

1 に答える 1

1

あなたはそれを誤解しています。
まず、LIST_HEAD_INITstruct Node mylinkedlistではなく、LIST_HEAD(mylinkedlist)を使用する必要があります。 mylinkedlist はカーネル リンク リスト構造体のスタンドアロン ヘッドである必要があり、すべての list_head をリンクするために使用されます。

次に、INIT_LIST_HEAD(&first.list)を実行する必要があります。これは、動的に割り当てる方法です。LIST_HEAD_INITは、構造体がコンパイル時に静的に作成されるときに使用されます。

最後に、list_add_tail(&first.list, &mylinkedlist)を実行する必要があります。

したがって、完全なコードは次のようになります。

LIST_HEAD(mylinkedlist);

void add(){
  struct Node first;
  first.data = 1;
  INIT_LIST_HEAD(&first.list);
  list_add_tail(&first.list, &mylinkedlist);
}

このコードは私にとってはうまくいきます。
Linuxカーネル開発の第6章を読むことをお勧めします。これは非常によく説明されています。

于 2013-10-29T01:32:37.870 に答える