C语言 如何使用LIST_FOREACH_SAFE



>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 以外的其他内容,则还应检查编译路径以确保包含正确的版本。

相关内容

  • 没有找到相关文章

最新更新