C++ STL的类在C中的相似替代品 经常情况下,在进行C编程时,我希望能够像C++的vector或list类一样使用某种高级数据结构,并且最终实现了某种削减版本的高级数据结构,但这需要花费相当多的时间。 我想知道是否有人知道一个好的库,其中包含高质量、简单的C数据结构?
除了像其他人建议的GLib之外,您可以创建自己的通用类型,没有任何类型安全性,例如使用void *
作为指向下一个堆栈对象的通用指针的链表。有些人甚至使用宏在ANSI C中创建类似模板的行为,并取得了一些合理的成功。在cplusplus.com的论坛上搜索一个或两个示例(如果我没记错的话,那里还不多)。
另外,您可以按照Object-Oriented Programming With ANSI C中描述的方式实现自己的面向对象方案,但这不是我推荐的东西。你可能会花费时间来创建那个“野兽”(最终可能不理解它如何工作),并学习GLib以熟悉它。
个人而言,我更喜欢第一种方法。虽然你会失去类型安全性并增加大量的强制转换,但这是最快实现的方法。那种方法的真正问题在于存储的数据。std::stack<int>
在转换成C时只是一个名为stack的结构体,其中有一个数据字段类型是int。那么std::vector<std::stack<int> >
呢?这是一个可寻址的整数堆栈列表。C标准不能保证从指针类型到整型的强制转换将不会丢失信息。换句话说,尽管你可以使用指针,但无法使用纯整数来存储信息。也许一些展开的模板专业化会起作用 —— 一个用于int,(一个用于long long吗?),一个用于double,还有一个用于指针类型。
最终,最好的解决方案是使用像GLib这样的库,但如果你喜欢自己编写,创造时要小心。你永远不知道何时需要将容器中的项类型组合在一起。
intptr_t
以实现此目的。 - Chris Lutzsizeof(void*) == 16
(128位指针)时,int64_t
(__int64
适用于MSVC用户)将能够保存void*
的值。虽然这样的系统可能只存在于理论上,但不能依赖此类代码。没有什么是未来可靠的,但至少可以尝试避免代码中断。 - user539810TYPE_MAX >= INTPTR_MAX
或无符号类型的TYPE_MAX >= UINTPTR_MAX
,或者更一般地(在运行时)如果sizeof(type) >= sizeof(void *)
,则可以轻松地保证其他整数类型保存这些信息。但是,如果您要在void *
中存储数字数据,您始终可以反转测试,或者只需始终使用(u)intptr_t
并让隐式整数转换处理任何潜在问题。 - Chris Lutz我喜欢使用GLib来处理这种事情;你最终编写的代码很干净,库易于使用、稳定、成熟且跨平台,文档也非常好。
你可能还想看看Rusty Russell的CCAN项目。虽然我没有使用过其中的任何代码,但下次有类似需求时我一定会去尝试一下:
思路