【发布时间】:2020-01-24 17:31:40
【问题描述】:
我正在尝试编写一个包含泛型双向链表宏的头文件。
节点定义如下:
#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; \
}
最后,声明了一个linkedlist(Student) ll;,它调用node(Student)并在编译时产生这个错误:
error: redefinition of ‘struct node_Student’
错误发生在第一次声明struct node_##T 的那一行。
有趣的是,当我像这样在结构定义的末尾插入分号时,错误就消失了:
. . . .
struct node_##T *prev; \
};
但是,这无法做到,因为这样声明 node(T) N; 将是不可能的。
有什么可能的解决方法?
【问题讨论】:
-
注意
struct node_##T在T为long long时将无法正常工作。 -
有趣.... 尝试使用 C 宏实现 C++ 模板。也许你应该升级到 C++!
标签: c struct c-preprocessor header-files user-defined-data-types