2013-05-10 104 views
0

我基本上想要將結構NodeA鏈接到結構NodeANodeB,例如。c中不同類型結構的鏈接結構?

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?

回答

1

該技術被稱爲「標記值」,並依賴於如果一個結構包含另一個作爲其第一個元素,然後鴨子鍵入(將指向較大結構的指針作爲指向較小內部的指針一個)是可能的,因爲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); 
} 

+0

感謝它解決我的問題! – user1821987 2013-05-10 20:25:43