>Platform:
Ubuntu 12.04 amd64, gcc, arm-linux-gnueabi-gcc
使用的库:
FreeBSD 库
问题:
我正在研究 FreeBSD 库。(参考资料)
我在使用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("%dn", 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 版本的 queue.h 手册页没有提到 FOREACH 或 FOREACH_SAFE 所涉及的任何数据结构。我不清楚您使用的是系统 queue.h 还是显式使用 FreeBSD 版本,但无论哪种方式,我都建议您通过 queue.h 快速执行 grep,以确保它包含一个LIST_FOREACH_SAFE宏。如果您使用的是系统提供的 queue.h 以外的其他内容,则还应检查编译路径以确保包含正确的版本。