gpt4 book ai didi

c - 如何使用 LIST_FOREACH_SAFE?

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:28 25 4
gpt4 key购买 nike

平台:

Ubuntu 12.04 amd64、gcc、arm-linux-gnueabi-gcc

使用的库:

FreeBSD 库

问题:

我正在研究 FreeBSD 库。( the reference )

我在使用 LIST_FOREACH_SAFE 时遇到编译错误,我不知道如何修复这个错误。

错误的输出:

test.c:39: error: ‘entries’ undeclared (first use in this function)
test.c:39: error: (Each undeclared identifier is reported only once
test.c:39: error: for each function it appears in.)
test.c:39: error: expected ‘;’ before ‘{’ token

代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/queue.h>

int main()
{
LIST_HEAD(listhead, entry) head =
LIST_HEAD_INITIALIZER(head);
struct listhead *headp; /* List head. */
struct entry {
int a;
LIST_ENTRY(entry) entries; /* List. */
} *n1, *n2, *n3, *np, *np_temp;

LIST_INIT(&head); /* Initialize the list. */

n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
n1->a = 7;
LIST_INSERT_HEAD(&head, n1, entries);

n2 = malloc(sizeof(struct entry)); /* Insert after. */
n2->a = 5;
LIST_INSERT_AFTER(n1, n2, entries);

n3 = malloc(sizeof(struct entry)); /* Insert before. */
n3->a = 1;
LIST_INSERT_BEFORE(n2, n3, entries);

LIST_REMOVE(n2, entries); /* Deletion. */
free(n2);

/* Forward traversal. */
LIST_FOREACH(np, &head, entries) {
printf("%d\n", np->a);
}


/* Safe forward traversal. */
LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
// do somethings
LIST_REMOVE(np, entries);
free(np);
}

return 0;
}

最佳答案

您粘贴的代码在 OS X 上编译(除了提示未使用的变量 headp。)我猜问题是无论您在 Linux 上使用的 queue.h 实现如何'包括 LIST_FOREACH_SAFE 宏。您的编译器可能将其视为函数的隐式声明,然后在无法解析“条目”时出错(因为它是结构成员,而不是变量。)

例如,使用 clang,如果我修改您的程序,而不是引用 LIST_FOREACH_SAFE,而是引用不存在的 LIST_FOREACH_SAFE_BOGUS,我会收到类似的错误:

/tmp/foreach.c:39:5: warning: implicit declaration of function
'LIST_FOREACH_SAFE_BOGUS' is invalid in C99
[-Wimplicit-function-declaration]
LIST_FOREACH_SAFE_BOGUS(np, &head, entries, np_temp) {
^
/tmp/foreach.c:39:40: error: use of undeclared identifier 'entries'
LIST_FOREACH_SAFE_BOGUS(np, &head, entries, np_temp) {
^
1 warning and 1 error generated.

Ubuntu 12.04 man page对于他们的 queue.h 版本,没有提及任何涉及的数据结构的 FOREACH 或 FOREACH_SAFE。我不清楚您是在使用系统 queue.h 还是明确使用 FreeBSD 版本,但无论哪种方式,我都建议您通过 queue.h 进行快速 grep 以确保它包含一个 LIST_FOREACH_SAFE 宏。如果您使用的不是系统提供的 queue.h,您还应该检查编译路径以确保包含正确的版本。

关于c - 如何使用 LIST_FOREACH_SAFE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com