C要求结构或联合至少有一个成员

C要求结构或联合至少有一个成员,c,compiler-errors,C,Compiler Errors,当我试图编译这段代码时,我从编译器那里得到了一堆奇怪的错误 我只是想写一个基本的链表,头文件在自己运行时编译得很好,但是当我编译c文件时,一切都崩溃了 linkedlist.h typedef struct Data { char *title; } Data; typedef struct LinkedList { LinkedList *next; Data *data; } LinkedList; LinkedList *createnew(void); voi

当我试图编译这段代码时,我从编译器那里得到了一堆奇怪的错误

我只是想写一个基本的链表,头文件在自己运行时编译得很好,但是当我编译c文件时,一切都崩溃了

linkedlist.h

typedef struct Data
{
    char *title;
} Data;

typedef struct LinkedList
{
    LinkedList *next;
    Data *data;
} LinkedList;

LinkedList *createnew(void);
void destroylist(LinkedList *old);
Data *adddata(void);
void destroydata(Data *old);
LinkedList.c

#include <stdlib.h>
#include "linkedlist.h"

LinkedList *createnew(void) {
    LinkedList *newnode = (LinkedList *) malloc(sizeof(LinkedList));
    newnode->data = adddata();
    newnode->next = NULL;
    return newnode;
}

void destroylist(LinkedList *old) {
    destroydata(old->data);
    free(old);
    return;
}

Data *adddata(void) {
    Data *newdata = (Data *) malloc(sizeof(Data));
    newdata->title = NULL;
    return newdata;
}

void destroydata(Data *old) {
    free(old->title);
    free(old);
    return;
}
我很困惑,因为它看起来似乎找到了这两个文件,但它的头有问题,即使它单独工作正常。 任何帮助都会很好。
谢谢

错误消息很奇怪,但是

typedef struct LinkedList
{
    LinkedList *next;
    Data *data;
} LinkedList;
LinkedList
不是定义中的已知类型,只有在定义完成后才知道,它必须是

typedef struct LinkedList
{
    struct LinkedList *next;
    Data *data;
} LinkedList;

头文件不是自己编译的。它们的唯一用途是在其他地方包含

标题中的错误是此部分:

typedef struct LinkedList  // <- defines the type 'struct LinkedList'
{
    LinkedList *next;      // <- attempts to use the type 'LinkedList', which isn't defined at this point
} LinkedList;              // <- defines the type 'LinkedList', or it would if the previous code were correct

我最喜欢的是:

// establish alias first, then use it everywhere
typedef struct LinkedList LinkedList;
struct LinkedList {
    LinkedList *next;
};

试试这个,它比其他建议更简洁(编辑:我看到melpomene在我之前提到过这个):

你会发现,当你移动到C++时,你可以移除TyPulf行。 如果有相互引用的结构,请将所有typedef上移到顶部,例如

typedef Type1 Type1;
typedef Type2 Type2;

struct Type1
{
    Type2* link;
};

struct Type2
{
    Type1* link;
};

除了<代码> Stutt > >代码> Link KEdList,您可能需要在VisualStudio./P>中明确地将“编译为”选项设置为C++。 我与这个C2016错误斗争了一段时间,最后通过设置选项将其修复

// use 'struct LinkedList' in its own definition but provide typedef to users
struct LinkedList {
    struct LinkedList *next;
};
typedef struct LinkedList LinkedList;
// like the previous version, but combine struct + typedef
typedef struct LinkedList {
    struct LinkedList *next;
} LinkedList;
// establish alias first, then use it everywhere
typedef struct LinkedList LinkedList;
struct LinkedList {
    LinkedList *next;
};
typedef struct Data Data;
struct Data
{
    char *title;
};

typedef struct LinkedList LinkedList;
struct LinkedList
{
    LinkedList *next;
    Data *data;
};
typedef Type1 Type1;
typedef Type2 Type2;

struct Type1
{
    Type2* link;
};

struct Type2
{
    Type1* link;
};