15 有什么方法可以将结构类型传递给 c 函数

我有一些具有多个功能非常相似的代码,用于根据结构中一个字段的内容在列表中查找项目。函数之间的唯一区别是发生查找的结构的类型。如果我可以传入类型,我可以删除所有代码重复。

我还注意到这些函数中也发生了一些互斥锁,所以我想我可以不理会它们......

请先 登录 后评论

4 个回答

JohnnyLambada

这样做的一种方法是将类型字段作为结构的第一个字节。您的接收函数查看此字节,然后根据它发现的内容将指针转换为正确的类型。另一种方法是将类型信息作为单独的参数传递给需要它的每个函数。

请先 登录 后评论
foxxtrot

由于结构只不过是预定义的内存块,因此您可以这样做。您可以将 void * 传递给结构,并传递一个整数或其他东西来定义类型。

从那里开始,最安全的做法是在访问数据之前将 void * 重铸为适当类型的指针。

您需要非常非常小心,因为当您转换为 void * 时会失去类型安全性,并且在执行此类操作时可能会遇到难以调试的运行时错误。

请先 登录 后评论
duane

简短的回答:不。但是,您可以为此创建自己的方法,即提供有关如何创建此类结构的规范。但是,这通常不是必需的,也不值得付出努力;只是通过引用。 (callFuncWithInputThenOutput(input, &struct.output);)

请先 登录 后评论
Jonathan Leffler

我认为您应该查看 C 标准函数 qsort() 和 bsearch() 以获得灵感。这些是对数组进行排序和在预排序数组中搜索数据的通用代码。它们适用于任何类型的数据结构 - 但您将指针传递给进行比较的辅助函数。辅助函数知道结构的细节,因此可以正确进行比较。

事实上,由于您想要进行搜索,您可能只需要 bsearch(),尽管如果您正在动态构建数据结构,您可能会决定您需要与排序列表不同的结构. (您可以使用排序列表——与堆相比,它只会减慢速度。但是,您需要一个通用的 heap_search() 函数和一个 heap_insert() 函数才能正确完成这项工作,并且此类函数在 C 中未标准化。搜索网络显示此类函数存在 - 不是那个名称;只是不要尝试“c heap search”,因为它假定您的意思是“廉价搜索”并且您会得到大量垃圾!)

请先 登录 后评论