gpt4 book ai didi

c - 如何创建一个包含动态设置数据类型的 C LinkedList

转载 作者:行者123 更新时间:2023-11-30 18:21:21 25 4
gpt4 key购买 nike

C中:

struct node {
int data;
int key;
struct node *next;
};

上面的C数据结构只能保存设定的数据类型,即int dataint key.

Java中:

List<?> objectList = new ArrayList<>();  

如何创建一个保存动态设置数据类型的 C LinkedList

想法是:

struct node {
<?> data;
<?> key;
struct node *next;
};

这样我就能做到:

List<String> objectList = new ArrayList<>();  

List<MyCustomObject> objectList = new ArrayList<>();  

C

struct node {
<String> data;
<String> key;
struct node *next;
};

struct node {
<MyCustomObject> data;
<MyCustomObject> key;
struct node *next;
};

最佳答案

你不能,因为动态 data types一般来说在C中不存在。通过阅读C11标准n1570进行检查.

你可能会做的是实现某种 tagged union type ,并创建一个包含这些的列表(或者可能是一个包含一些指向它们的指针的列表,但您需要决定一些 memory management 策略和相关的编码约定)。

如何实现此类标记的 union 类型是不同的问题。如需灵感,请查看 Glib GVariant类型(但还有其他方法可以做到这一点;一个例子是 Python 值类型,请在 extending Python 章节中阅读更多相关信息;或者一些包含一些 unionstruct,或者struct 的一些 union 都以公共(public)区分字段开头,或者指向此类 struct 的指针的一些 union 等.),并研究source code Glib 中的实现,即 free software .

您还可以考虑一些 metaprogramming方法,例如根据数据类型的一些描述生成一些 C 代码。查看SWIGRPCGEN寻找灵感。

顺便说一句,SGLIB header-moSTLy 库使用了大量 preprocessor技术(使用巨大的 C 宏)提供“通用”容器。

另请注意 ABIcalling conventions你的 C 实现。在某些情况下,它可能有助于理解它(例如,如果您决定使用 tagged pointers )。请注意,许多基本 C 类型(intlongchar、data pointersfunction pointers )具有本质上不同的表示形式(不同的大小) ,不同的 alignments ,作为参数传递并作为结果返回的不同方式 - 例如在各种 processor registers 或在 call stack 上),甚至可能不同的 address spaces (想想Harvard architecture,其中函数指针与数据位于不同的空间,甚至可能具有与数据指针不同的大小)。

关于c - 如何创建一个包含动态设置数据类型的 C LinkedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50056875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com