创建C语言 "模板 "函数

问题描述 投票:0回答:1

我目前正在做一个项目,需要使用一些链接列表。

我已经习惯了它们,但我真的不喜欢我需要重复我的代码。我的意思是这样的。

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;
}

因为我们修改的是相同的内存空间,我想这是可行的,但我想可能会发生一些意外的问题。我想知道在C语言中是否可以存在更像C++模板的东西。

任何帮助将是感激的。我想知道是否有类似于C++模板的东西可以在C语言中存在。

c pointers templates structure
1个回答
1
投票

如果你想看的话,我有完整的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(&current.head), struct my_type, head));

什么是 container_of 宏?

了解Linux内核中的container_of宏。

如果你想看看使用模板实现的完整解决方案,我得到了一个免费使用的解决方案(风险自负)。

该库。https:/github.comflplvfl-libblobmasterheaderslinked_list.h。

的用法。https:/github.comflplvfl-libblobmasterteststest_linked_list.cpp。

© www.soinside.com 2019 - 2024. All rights reserved.