ジェネリック型の二重リンクリストのマクロを含むヘッダーファイルを書き込もうとしています。
ノードは次のように定義されます。
#define node(T) \
struct node_##T \
{ \
T val; \
struct node_##T *next; \
struct node_##T *prev; \
}
次にnode(T)
、linkedlist(T)
構造体の作成に使用しています。
#define linkedlist(T) \
struct linkedlist_##T \
{ \
unsigned int count; \
node(T) *head; \
node(T) *end; \
}
最後に、alinkedlist(Student) ll;
が宣言されます。これはnode(Student)
、コンパイル時にこのエラーを呼び出して生成します。
error: redefinition of ‘struct node_Student’
エラーstruct node_##T
は、最初に宣言された行で発生します。
興味深いことに、次のように構造体定義の最後にセミコロンを挿入すると、エラーがなくなります。
. . . .
struct node_##T *prev; \
};
ただし、宣言node(T) N;
が不可能になるため、これを行うことはできません。
可能な修正は何でしょうか?
コンパイラは完全に正しいです。構造体を再宣言しています。リンクリストの定義を次のように変更します
#define linkedlist(T) \
struct linkedlist_##T \
{ \
unsigned int count; \
struct node_##T *head; \
struct node_##T *end; \
};
代わりに。どこかに行く前にnode(T)
、それぞれT
に別々の行を用意する必要がありますlinkedlist(T)
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加