我想了解Freebsd中的queue (3)宏的內部工作原理。我曾問過以前的question關於同一主題,這是一個後續問題。不兼容的指針類型 - 爲什麼?
我想定義一個函數來插入一個元素到隊列中。 queue (3)提供宏STAILQ_INSERT_HEAD
,其需要指向隊列頭部的指針,隊列中的項目的類型以及要插入的項目。我的問題是,我得到
stailq.c:31: warning: passing argument 1 of 'addelement' from incompatible pointer type
錯誤,當我嘗試的head
地址傳遞給函數。完整的源代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>
struct stailq_entry {
int value;
STAILQ_ENTRY(stailq_entry) entries;
};
STAILQ_HEAD(stailhead, stailq_entry);
int addelement(struct stailhead *h1, int e){
struct stailq_entry *n1;
n1 = malloc(sizeof(struct stailq_entry));
n1->value = e;
STAILQ_INSERT_HEAD(h1, n1, entries);
return (0);
}
int main(void)
{
STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
struct stailq_entry *n1;
unsigned i;
STAILQ_INIT(&head); /* Initialize the queue. */
for (i=0;i<10;i++){
addelement(&head, i);
}
n1 = NULL;
while (!STAILQ_EMPTY(&head)) {
n1 = STAILQ_LAST(&head, stailq_entry, entries);
STAILQ_REMOVE(&head, n1, stailq_entry, entries);
printf ("n2: %d\n", n1->value);
free(n1);
}
return (0);
}
據我所知,head
是struct stailhead
類型和addelement
功能,也期望一個指針struct stailhead
。
STAILQ_HEAD(stailhead, stailq_entry);
擴展爲:
struct stailhead {
struct stailq_entry *stqh_first;
struct stailq_entry **stqh_last;
};
缺少什麼我在這裏?
謝謝。
它可能與您調用STAILQ_HEAD宏兩次的事實有關,因此重新定義了該結構。不要這樣做。只需將頭部聲明爲所需類型的結構(即「struct stailhead head;」)。這些宏不是名稱空間無效的。 – tbert 2012-04-06 06:08:58