【发布时间】:2017-06-21 19:03:49
【问题描述】:
我来自 Java,我正在尝试在 C 中实现一个双向链表作为练习。我想做一些类似于 Java 泛型的事情,我会将指针类型传递给列表初始化,并且此指针类型将用于强制转换列表 void 指针,但我不确定这是否可能?
我正在寻找的是可以存储在列表结构中并用于将 *data 从节点转换为正确类型的东西。我正在考虑使用双指针,但我需要将其声明为 void 指针,我也会遇到同样的问题。
typedef struct node {
void *data;
struct node *next;
struct node *previous;
} node;
typedef struct list {
node *head;
node *tail;
//??? is there any way to store the data type of *data?
} list;
【问题讨论】:
-
我不明白所有关于 空指针 的东西 ...
0评估为任何类型的空指针,(void *)0也是如此 ...但是至于代码注释中更清晰的问题:并非如此,您必须提出自己的解决方案(例如,enum用于您使用的类型)。 C 中的类型信息一旦编译就不再存在,因此没有“type”类型的对象。 -
可以使用
void list_put_int(list *L, int *p) { .... xx.data = p; ...}和int *list_get_int(list *L) { .... return xx.data;}但正如@Felix Palmen 所说,没有“类型”类型的对象,也没有在运行时发生变化的演员,(除了可能是VLAs.and反正在这里也无济于事。) -
代码可以使用带有宏的
_Generic来实现大部分目标。这有点令人费解。 -
@FelixPalmen 你说得对,对不起,我的大脑掉进了 null 而不是 void,更新了问题
标签: c casting null-pointer