0

平台:

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("%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;
}
4

1 回答 1

3

您粘贴的代码在 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.

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

于 2013-12-06T08:34:01.443 回答