【发布时间】:2010-10-18 16:32:54
【问题描述】:
这不完全是一个技术问题,因为我知道 C 足以做我需要做的事情(我的意思是,不让语言妨碍你的方式),所以这个问题基本上是一个“采取什么方向”的问题。
情况是:我目前正在学习高级算法课程,为了“成长为程序员”,我需要使用纯 C 来实现实际作业(效果很好:几乎任何小错误你make 实际上迫使你完全理解你在做什么来修复它)。在实现过程中,我显然遇到了必须从头开始实现“基本”数据结构的问题:实际上不仅是链表,还有堆栈、树等。
我将重点放在本主题中的列表上,因为它通常是我最终在程序中经常使用的一种结构,既可以作为“主”结构,也可以作为其他较大结构的“辅助”结构(例如,哈希使用链表解决冲突的树)。
这要求列表存储许多不同类型的元素。我在这里假设我不想为每种类型重新编码列表。所以,我可以想出这些替代方案:
- 创建一个 void 指针列表(有点不雅;更难调试)
- 只制作一个列表,但有一个 union 作为“元素类型”,包含我将在程序中使用的所有元素类型(更易于调试;如果元素大小不同,则会浪费空间)
- 使用预处理器宏以SGLIB 的样式为每种类型重新生成代码,“模仿”C++ 的STL(创造性的解决方案;不浪费空间;元素具有它们返回时实际的显式类型; 列表代码的任何变化都可能非常引人注目)
- 您的想法/解决方案
为了明确问题:以上哪一项最好?
PS:由于我基本上是在学术环境中,我也对业内使用纯 C 语言的人们的看法非常感兴趣。我知道大多数纯 C 程序员都在嵌入式设备领域,我认为我面临的这种问题并不常见。但是,如果有人知道它在“现实世界”中是如何完成的,我会对您的意见非常感兴趣。
【问题讨论】:
-
为什么空指针很难调试?这在任何类型的调试器中都是微不足道的,具有良好的表达式评估。
-
确实如此,而你现在正是我开始思考的时候。我以前的算法教授有点强迫这种抵抗对我们无效的指针。但这仍然使代码难以通过阅读来理解。
-
嗯,你应该避免使用 void*,只要语言提供了这样的功能......但是如果你想要 c 中的多态......
标签: c linked-list containers generic-programming