【问题标题】:What is a generic library in C? [closed]什么是 C 中的泛型库? [关闭]
【发布时间】:2013-02-10 13:05:38
【问题描述】:

我第一次遇到这个称为泛型库的术语,我无法理解泛型库的含义。

【问题讨论】:

  • 在 C++ 中,泛型机制称为“模板”。只是提一下,以便您可以进行更好的研究并改进问题。
  • @NiklasB,泛型不一定指模板。它可能是“通用声音处理库”。 OP 需要澄清他在什么背景下听到的。
  • @NiklasB.:C89 没有泛型。现代 C(最新标准)具有泛型。或者,该标准称为泛型
  • @NiklasB.:从语法上讲,C 没有直接的方法,但这并不意味着您不能设计通用库。见this 和this
  • @Cheersandhth.-Alf:很酷,标准中所谓的泛型是什么?

标签: c++ c data-structures


【解决方案1】:

泛型库是一种可以与多种类型一起使用的库,例如不止一种数字类型

在 c11 中,通用定义可能如下所示:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)

在 C 的早期版本中,必须使用各种宏技巧,例如如the commentary中的SO question referred to by @user1929959所示

【讨论】:

  • 而基于void* 的定义是另一种方法...
  • 您能否指出您所显示的代码的解释?语法看起来很奇怪(我不熟悉 c11),我无法得出它的意图。
  • @MM.: 是的,一种达到相同目的的方法,但我从未听说过这种方法被称为通用代码。不同之处在于其中一个客户端代码执行与void* 之间的转换,而不是隐藏在宏中并通过集中测试确保安全
  • @Niklas:通过谷歌搜索“c++11 _Generic”,我找到了a blog with a simple explanation。当然语言标准是最终权威。
  • @Cheersandhth.-Alf:在 C 中编写通用内容是一种众所周知的方式。但缺乏封装性和透明度是我们转向 C++ 的原因之一。阅读this
【解决方案2】:

这里的“通用”可能意味着“参数化数据类型”(来自Java?)。唉,C 在处理(数据)类型方面非常薄弱——在“类型安全”的意义上。因此,C 中的常用方法是使用 回调函数 对算法进行参数化,您必须实现该算法才能完成特定于类型的工作。然后数据本身通常由void* 表示。

作为示例,您可以查看 C 标准函数 qsort(来自 man sort):

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

base 是指向您的数据的“通用”指针,nmemb 和 size 是有关您的数据的附加信息,compar 将是您必须提供的回调函数比较数据类型的两个元素。

有许多库可以为您提供算法。这个数字太大了,您需要指定...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2010-09-15
    相关资源
    最近更新 更多