Freebsd에서 queue (3) 매크로의 내부 동작을 이해하려고합니다. 나는 이전에 question에 대해 같은 주제에 대해 물어 보았습니다. 그리고 이것에 대한 후속 질문입니다.호환되지 않는 포인터 유형 - 이유가 무엇입니까?
대기열에 요소를 삽입하는 함수를 정의하려고합니다. queue (3)은 큐 머리글, 큐에있는 항목의 유형 및 삽입 할 항목에 대한 포인터가 필요한 매크로 STAILQ_INSERT_HEAD
을 제공합니다. 내 문제는 내가 함수에 head
의 주소를 통과 할 때 나는
stailq.c:31: warning: passing argument 1 of 'addelement' from incompatible pointer type
오류가 발생하고 있다는 점이다.
#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
에 대한 포인터를 기대하고, 다음과 같이 전체 소스 코드입니다. 내가 여기 실종 무엇
struct stailhead {
struct stailq_entry *stqh_first;
struct stailq_entry **stqh_last;
};
:
STAILQ_HEAD(stailhead, stailq_entry);
는로 확장?
감사합니다. 무엇 일어나는 것은 STAILQ_HEAD
새로운 유형을 정의하는 매크로는 점이다
STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
struct stailhead head = STAILQ_HEAD_INITIALIZER(head);
에
이것은 STAILQ_HEAD 매크로를 두 번 호출하여 구조체를 재정의한다는 것과 관련이있을 수 있습니다. 그러지 마. 헤드를 원하는 유형의 구조체로 선언하면됩니다 (예 : "stailhead head 구조체"). 이 매크로는 네임 스페이스 - 효과가 없습니다. – tbert