Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C头文件中定义的自引用结构产生错误_C_Struct_C Preprocessor_Header Files_User Defined Data Types - Fatal编程技术网

在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;       \
    }
最后,a
linkedlist(Student)ll,它调用
节点(学生)
,并在编译时产生此错误:

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)
。您只需要在代码中执行一次。