c - C中的泛型编程

标签 c generics printf void-pointers generic-programming

我正在用纯 C 编写通用链表实现。

struct Node {
    void *value;
    struct Node *next;
};

struct LinkedList {
    struct Node *start;
    struct Node *end;
};

void LinkedList_new(struct LinkedList* llist) {
    llist->start = 0;
    llist->end = 0;
    return;
}

void addNode( struct LinkedList *ll, void *_value ) {
    if ( NULL == ll->start ) {
        ll->start = (struct Node *) malloc( sizeof(struct Node) );
        ll->end = ll->start;
    } else {
        ll->end->next = (struct Node *) malloc( sizeof(struct Node) );
        ll->end = ll->end->next;
    }
    ll->end->value = _value;
    return;
};

这一切都很好。我的问题是当我将值打印到屏幕上时。我似乎找不到打印的通用实现。

有没有办法确定分配给 void * 的 TYPE? (然后使用 switch 语句进行转换)

void printFunc(int aInt) {
    char str[15];
    sprintf(str, "%d", aInt);
    printf(str);
}

这是一个适用于 int 的实现。我想的最坏情况是为每种类型编写不同的函数。这真的是我使用 void * 时唯一的路线吗?

有更好的方法吗?

最佳答案

不,没有办法仅从指针中得出这一点。这将需要将类型信息存储在所有运行时结构中某个明确定义的位置,这根本不是 C 使用机器的方式。

常见的解决方案是让数据类型的用户提供应用程序需要的打印功能,因为应用程序知道存储的数据类型。也就是说,通常有一个迭代函数接受一个函数指针,在列表的每个元素上调用用户的函数(可能打印元素)。

下面是这样一个函数的样子:

void LinkedList_foreach(const LinkedList *start,
                        bool (*func)(void *element, void *data), void *data);

上面的代码应该为列表的每个元素调用func(),将元素的数据传递给用户提供的附加数据调用者可以用来维护遍历状态的指针。回调 func() 应返回 false 以停止迭代,返回 true 以继续。

要打印一个整数,假设整数存储在指针中,您可以:

static bool print_int(void *element, void *data)
{
  printf("%d\n", (int) element);
  return true;
}

此外,please don't cast the return value of malloc() in C .

关于c - C中的泛型编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238185/

相关文章:

c++ - BuildCommDCB 实际上做了什么?

goto的C用法

c - sizeof(function) 总是返回 1。为什么?

c++ 如果使用 sprintf 打印的字符多于 char 指针分配的字符,会发生什么情况?

java - 我无法让我的 printf 语句在 java 中对齐

c - 这段c代码中的getchar()有什么用?

c - 如何使用fscanf从忽略标点的输入文件中读取单词?

scala - Scala:参数化类型只是语法糖(如Odersky所建议)吗?

c# - 抽象泛型类型变量的声明

java.util.Collections 上的 Java 泛型警告