Tag: 容器

具有宏的类型安全的通用容器

我正在尝试使用宏在C中创建一个类型安全的通用链表。 它应该与模板在C ++中的工作方式类似。 例如, LIST(int) *list = LIST_CREATE(int); 我的第一次尝试是#define LIST(TYPE) (我上面使用的宏)来定义struct _List_##TYPE {…} 。 但是,这不起作用,因为每次我声明一个新列表时都会重新定义结构。 我通过这样做解决了这个问题: /* You would first have to use this macro, which will define the `struct _List_##TYPE`… */ DEFINE_LIST(int); int main(void) { /* … And this macro would just be an alias for the struct, it wouldn’t actually define it. */ […]

纯C中的“多用途”链表实现

这不完全是一个技术问题,因为我知道C有足够的东西来做我需要的东西(我的意思是,不是’让语言妨碍你’),所以这个问题基本上是’什么方向’采取’问题。 情况是:我目前正在学习高级算法课程,并且为了“成长为程序员”,我需要使用纯C来实现实际任务(它运作良好:几乎任何小错误你实际上都是你完全理解你正在做什么来解决它)。 在实现过程中,我显然遇到了必须从头开始实现“基本”数据结构的问题:实际上不仅是链表,还有堆栈,树等等。 我专注于本主题中的列表,因为它通常是一个结构,我最终在程序中使用了很多,作为“主”结构或作为其他更大的结构的“帮助”结构(例如,解决的哈希树)使用链表冲突)。 这要求列表存储许多不同类型的元素。 我假设这里作为一个前提,我不想为每种类型重新编码列表。 所以,我可以提出这些替代方案: 制作一个void指针列表(有点不优雅;更难调试) 只创建一个列表,但是将一个联合作为“元素类型”,包含我将在程序中使用的所有元素类型(更容易调试;如果元素的大小不同,则浪费空间) 使用预处理器宏来重新生成每种类型的代码,以SGLIB的方式 ,“模仿”C ++的STL(创造性的解决方案;不浪费空间;元素具有返回时实际的显式类型; 列表中的任何更改代码可以真的很戏剧性 ) 你的想法/解决方案 要明确问题:上述哪一个最好? PS:由于我基本上处于学术背景中,因此我对在业内使用纯C的人的观点也非常感兴趣。 我知道大多数纯C程序员都在嵌入式设备领域,我不认为我面临的这种问题很常见。 但是,如果那里的任何人都知道它是如何“在现实世界中”完成的,那么我对你的意见非常感兴趣。