0

NodeA私は基本的に、構造体を構造体NodeAまたは構造体にリンクしたいと考えていNodeBます。

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 に答える