gpt4 book ai didi

c - 如何在结构中使用 ck_list?

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:48 24 4
gpt4 key购买 nike

我正在使用库 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.

最佳答案

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

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

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

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