创建 C "Template" 函数
Creating C "Template" function
我目前正在做一个需要我使用一些链表的项目。
我已经习惯了它们,但我真的不喜欢我需要复制我的代码这一事实。
这就是我的意思:
struct A {
struct A *prev;
struct A *next;
int i;
}
struct B {
struct B *prev;
struct B *next;
char *str;
}
如果我想创建一个函数来将一个元素添加到我喜欢的任何列表中,我需要做类似的事情:
void add_A_element(struct A *list, struct A *new_element) { [...] }
void add_B_element(struct B *list, struct B *new_element) { [...] }
这是我的问题,有没有办法让我的所有结构只有一个功能?
我想知道我是否可以使用其他结构来做到这一点,例如:
struct template {
struct template *prev;
struct template *next;
}
然后添加我的元素的函数将如下所示:
void add_element(void *list, void *new_element)
{
struct template tmp_list = (struct template *)list;
struct template tmp_new_element = (struct template *)new_element;
for (struct template tmp = tmp_list; tmp != NULL; tmp = tmp->next) {
if (tmp->next == NULL) {
tmp->next = tmp_new_element;
tmp_new_element->prev = tmp;
break;
}
}
return;
}
因为我们修改了相同的内存space,我想这可行,但我认为可能会发生一些意想不到的问题。
我想知道 C 中是否存在一些看起来更像 C++ 模板的东西。
如有任何帮助,我们将不胜感激。谢谢
编辑:我设法做到了。我仍在计划添加一些东西,例如 fifo/lifo 队列,但您已经可以在 my Github
上获得它
如果你想看一下,我有完整的 C 模板(宏)解决方案,最后有链接。同时,让我解释一下如何解决这个问题:
你应该使用container_of
策略来抽象地遍历链表。
struct linked_list_head
{
struct linked_list_head * next;
struct linked_list_head * prev;
};
struct my_type {
...
struct linked_list_head head;
}
那么获取下一个的代码将是
struct linked_list_head next(struct linked_list_head * current) {
return current->next;
}
struct my_type next = container_of(next(¤t.head), struct my_type, head));
什么是container_of
宏?
Understanding container_of macro in the Linux kernel
如果您想查看使用模板实现的完整解决方案,我有一个免费使用(风险自负)的解决方案:
图书馆:https://github.com/flplv/fl-lib/blob/master/headers/linked_list.h
用法:https://github.com/flplv/fl-lib/blob/master/tests/test_linked_list.cpp
我目前正在做一个需要我使用一些链表的项目。
我已经习惯了它们,但我真的不喜欢我需要复制我的代码这一事实。 这就是我的意思:
struct A {
struct A *prev;
struct A *next;
int i;
}
struct B {
struct B *prev;
struct B *next;
char *str;
}
如果我想创建一个函数来将一个元素添加到我喜欢的任何列表中,我需要做类似的事情:
void add_A_element(struct A *list, struct A *new_element) { [...] }
void add_B_element(struct B *list, struct B *new_element) { [...] }
这是我的问题,有没有办法让我的所有结构只有一个功能?
我想知道我是否可以使用其他结构来做到这一点,例如:
struct template {
struct template *prev;
struct template *next;
}
然后添加我的元素的函数将如下所示:
void add_element(void *list, void *new_element)
{
struct template tmp_list = (struct template *)list;
struct template tmp_new_element = (struct template *)new_element;
for (struct template tmp = tmp_list; tmp != NULL; tmp = tmp->next) {
if (tmp->next == NULL) {
tmp->next = tmp_new_element;
tmp_new_element->prev = tmp;
break;
}
}
return;
}
因为我们修改了相同的内存space,我想这可行,但我认为可能会发生一些意想不到的问题。
我想知道 C 中是否存在一些看起来更像 C++ 模板的东西。
如有任何帮助,我们将不胜感激。谢谢
编辑:我设法做到了。我仍在计划添加一些东西,例如 fifo/lifo 队列,但您已经可以在 my Github
上获得它如果你想看一下,我有完整的 C 模板(宏)解决方案,最后有链接。同时,让我解释一下如何解决这个问题:
你应该使用container_of
策略来抽象地遍历链表。
struct linked_list_head
{
struct linked_list_head * next;
struct linked_list_head * prev;
};
struct my_type {
...
struct linked_list_head head;
}
那么获取下一个的代码将是
struct linked_list_head next(struct linked_list_head * current) {
return current->next;
}
struct my_type next = container_of(next(¤t.head), struct my_type, head));
什么是container_of
宏?
Understanding container_of macro in the Linux kernel
如果您想查看使用模板实现的完整解决方案,我有一个免费使用(风险自负)的解决方案:
图书馆:https://github.com/flplv/fl-lib/blob/master/headers/linked_list.h
用法:https://github.com/flplv/fl-lib/blob/master/tests/test_linked_list.cpp