我正在使用库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.
答案 0 :(得分:0)
我相信我找到了答案,只需使用CK_LIST_HEAD_INITIALIZER()
初始化一个结构,然后指向它,就像这样。
struct shared_data mapping = { .list = CK_LIST_HEAD_INITIALIZER(mapping->list) };
struct shared_data *map = &mapping;