私があなたの主張を理解しているかどうかはよくわかりませんが、あなたができることは、ポリモーフィック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
...
...