私があなたの主張を理解しているかどうかはよくわかりませんが、あなたができることは、ポリモーフィックstruct
の短い部分を実装することだと思います。あなたの場合node
、タグとdllnode
タイプです。タグは、構造体自体内の構造体を参照するために必要です。そのため、最後のステートメントが失敗し、struct node
正当であるだけです。静的な設計で動的な動作を行うことはできません。私があなたなら、デザインを次のように変更します。
struct dllnode{
node super;
dllnode *next;
dllnode *prev;
size_t elem_size;
void *payload;
uint32_t flag;
};
struct node{
node *next;
node *prev;
size_t elem_size;
void *payload;
};
したがって、node
コード内にプリミティブ型と複数の「子」型dllnode
または必要なその他のノード型を含めることができます。父親 (ノード) を子供 (dllnode) としてキャストすることにより、2 つの構造体間で値を交換できます。これは、C 標準では、構造体の最初のメンバーは構造体の先頭に配置されると規定されているためです。例えば:
void add_dllnode(struct node *s)
{
struct dllnode *self = (struct dllnode *) s;
self->next = s->next;
self->prev = s->prev;
self->elem_size = s->elem_size;
self->payload = s->payload;
// you can now do treat node as if it's dllnode and probably add it to
// one of your lists
}
さらに、フラグメンバーを作成するたびにnode
、フラグメンバーを次のように調整しNODE_TYPE_DLL
たりNODE_TYPE_OTHER
、呼び出しの条件として使用したりできます。
struct node s;
init_node(s);
...
if(((s->flag) & NODE_TYPE_DLL))
add_dllnode(s);
else
...
...