如何在结构中使用ck_list?

时间:2015-08-28 21:59:23

标签: c struct

我正在使用库http://concurrencykit.org/,更具体地说,我使用CK_LIST多读者单作家链接列表。除了concurrencyKit附带的单元和回归测试之外,我没有在线可以找到的示例或文档,但我想出了如何在它上面使用CK_LIST,这可以在下面看到

#include <stdio.h>
#include <stdlib.h>
#include <ck_queue.h>

struct list_node
{
    void *data;

    CK_LIST_ENTRY(list_node) list_entry;

};

static CK_LIST_HEAD(list, list_node) list = CK_LIST_HEAD_INITIALIZER(list);

int main(void)
{
    struct list_node *node, *node2;

    CK_LIST_INIT(&list);

    node = malloc(sizeof(struct list_node));
    if(node == NULL)
    {
        perror("malloc");
        return -1;
    }

    int rtrn = asprintf((char **)&node->data, "test");
    if(rtrn < 0)
    {
        perror("asprintf");
        free(node);
        return -1;
    }

    CK_LIST_INSERT_HEAD(&list, node, list_entry);

    CK_LIST_FOREACH(node2, &list, list_entry)
    {
        printf("out: %s\n", node2->data);
    }

    free(node->data);
    free(node);

    return 0;
}

但是我想在结构中使用CK_LIST,以便我可以将其作为共享内存进行映射,并在多个进程中使用该列表。但是当我尝试在结构中使用CK_LIST时,我会遇到编译器错误。

#include <stdio.h>
#include <stdlib.h>
#include <ck_queue.h>

struct shared_data
{
    CK_LIST_HEAD(list, list_node) list;
};

struct list_node
{
    void *data;

    CK_LIST_ENTRY(list_node) list_entry;

};

int main(void)
{
    struct list_node *node, *node2;
    struct shared_data *data;

    node = malloc(sizeof(struct list_node));
    if(node == NULL)
    {
        perror("malloc");
        return -1;
    }

    data->list = CK_LIST_HEAD_INITIALIZER(data->list);

    CK_LIST_INIT(&data->list);

    int rtrn = asprintf((char **)&node->data, "test");
    if(rtrn < 0)
    {
        perror("asprintf");
        free(node);
        return -1;
    }

    CK_LIST_INSERT_HEAD(&data->list, node, list_entry);

    CK_LIST_FOREACH(node2, &data->list, list_entry)
    {
        printf("out: %s\n", node2->data);
    }

    free(node->data);
    free(node);

    return 0;
}

那么如何在结构中使用CK_LIST

修改

这是编译器输出。

ck_list_test.c:32:18: error: expected expression
    data->list = CK_LIST_HEAD_INITIALIZER(data->list);
                 ^
/usr/local/include/ck_queue.h:339:2: note: expanded from macro 'CK_LIST_HEAD_INITIALIZER'
        { NULL }
        ^
1 error generated.

1 个答案:

答案 0 :(得分:0)

我相信我找到了答案,只需使用CK_LIST_HEAD_INITIALIZER()初始化一个结构,然后指向它,就像这样。

struct shared_data mapping = { .list = CK_LIST_HEAD_INITIALIZER(mapping->list) };
struct shared_data *map = &mapping;