0

我本质上想将一个结构链接NodeA到一个结构NodeANodeB,例如。

struct NodeA{
   int type;
   int data;
   void *ptr;
};

struct NodeB{
   int type;
   float data;
   void *ptr;
};

NodeA Node1;
NodeB Node2;

Node1.ptr = &Node2;

然后以某种方式读取类型,然后判断它是节点 A 还是 B。

if( Node1.ptr.type == 1){ ...

这在C中可能吗?

4

1 回答 1

2

这种技术称为“标记值”,它依赖于这样一个事实:如果一个结构包含另一个结构作为其第一个元素,那么鸭子类型(将指向较大结构的指针视为指向较小的内部结构的指针)是可能的,因为 C 标准保证在结构的第一个元素之前不能有填充。

struct descriptor {
    int type;
};

struct A {
    struct descriptor base;
    int data;
};

struct B {
    struct descriptor base;
    float data;
};

enum {
    TYPE_INT,
    TYPE_FLOAT
};

struct A a = { .base.type = TYPE_INT, .data = 42 };
struct B b = { .base.type = TYPE_FLOAT, .data = 3.14 };

struct descriptor *desc = (struct descriptor *)&a;
if (desc->type == TYPE_INT) {
    printf("%d\n", ((struct A *)desc)->data);
} else {
    printf("%f\n", ((struct B *)desc)->data);
}

等等

于 2013-05-10T20:13:05.127 回答