在C头文件中定义的自引用结构产生错误
我正在尝试为泛型类型的双链接列表编写包含宏的头文件 节点定义如下:在C头文件中定义的自引用结构产生错误,c,struct,c-preprocessor,header-files,user-defined-data-types,C,Struct,C Preprocessor,Header Files,User Defined Data Types,我正在尝试为泛型类型的双链接列表编写包含宏的头文件 节点定义如下: #define node(T) \ struct node_##T \ { \ T val; \ struct node_##T *next; \ struct node_##T *prev; \ } 然后,我使用节点(T)
#define node(T) \
struct node_##T \
{ \
T val; \
struct node_##T *next; \
struct node_##T *prev; \
}
然后,我使用节点(T)
创建链接列表(T)
结构:
#define linkedlist(T) \
struct linkedlist_##T \
{ \
unsigned int count; \
node(T) *head; \
node(T) *end; \
}
最后,alinkedlist(Student)ll声明了code>,它调用节点(学生)
,并在编译时产生此错误:
error: redefinition of ‘struct node_Student’
错误发生在第一次声明struct node_35;#T
的行
有趣的是,当我在结构定义的末尾插入分号时,错误消失了,如下所示:
. . . .
struct node_##T *prev; \
};
然而,这不能像声明节点(T)N那样进行代码>将是不可能的
可能的修复方法是什么?编译器完全正确。您正在重新定义您的结构。将链表定义更改为
#define linkedlist(T) \
struct linkedlist_##T \
{ \
unsigned int count; \
struct node_##T *head; \
struct node_##T *end; \
};
相反。在linkedlist(T)
之前的某个地方,你需要为每个T
单独设置一行node(T)
。注意struct node#T
在T
很长的时候,它就不能正常工作。有趣的是。。。。尝试用C++宏实现C++模板。也许你应该升级到C++!如果您尝试使用linkedlist(T)
声明多个变量,您仍然会得到一个重新定义。\if
/\endif
保护帮助吗?非常感谢,现在我了解了错误所在。然而,linkedlist(T)用作类型,因此添加节点(T)无法将代码>添加到定义中。我只是编辑了这个问题来澄清这一点,然后在宏本身之外做一个node(T)
。您只需要在代码中执行一次。