1

このコードをコンパイルしようとすると、コンパイラから一連の奇妙なエラーが発生します。

基本的なリンクリストを書こうとしているだけで、ヘッダーファイルは単独で実行するとうまくコンパイルされますが、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;
}

そして最後にコンパイラが吐き出すもの

linkedlist.h(8): error C2016: C requires that a struct or union has at least one member
linkedlist.h(8): error C2061: syntax error : identifier 'LinkedList'
linkedlist.h(10): error C2059: syntax error : '}'
linkedlist.h(12): error C2143: syntax error : missing '{' before '*'
linkedlist.h(13): error C2143: syntax error : missing ')' before '*'
linkedlist.h(13): error C2143: syntax error : missing '{' before '*'
linkedlist.h(13): error C2059: syntax error : ')'
linkedlist.c(4): error C2143: syntax error : missing '{' before '*'
linkedlist.c(5): error C2065: 'LinkedList' : undeclared identifier
linkedlist.c(5): error C2065: 'newnode' : undeclared identifier
linkedlist.c(5): error C2059: syntax error : ')'
linkedlist.c(6): error C2065: 'newnode' : undeclared identifier
linkedlist.c(6): error C2223: left of '->data' must point to struct/union
linkedlist.c(7): error C2065: 'newnode' : undeclared identifier
linkedlist.c(7): error C2223: left of '->next' must point to struct/union
linkedlist.c(8): error C2065: 'newnode' : undeclared identifier
linkedlist.c(8): warning C4047: 'return' : 'int *' differs in levels of indirection from 'int'
linkedlist.c(11): error C2143: syntax error : missing ')' before '*'
linkedlist.c(11): error C2143: syntax error : missing '{' before '*'
linkedlist.c(11): error C2059: syntax error : ')'
linkedlist.c(11): error C2054: expected '(' to follow 'old'

両方のファイルを見つけたように見えるので混乱していますが、単独では問題なく動作しますが、ヘッダーに問題があります。どんな助けでも素晴らしいでしょう。ありがとう

4

4 に答える 4

7

エラーメッセージは変ですが、

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

LinkedList定義では既知の型ではありません。定義が完了した後にのみ認識されます。

typedef struct LinkedList
{
    struct LinkedList *next;
    Data *data;
} LinkedList;
于 2013-02-26T22:52:17.377 に答える
4

ヘッダー ファイルは、単独ではコンパイルされません。それらの唯一の用途は、#include他の場所で使用されることです。

ヘッダーのエラーは次の部分です。

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

これを修正するには、いくつかの方法があります。

// forget about 'LinkedList'; just use 'struct LinkedList' everywhere
struct LinkedList {
    struct LinkedList *next;
};

// 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;
};
于 2013-02-26T22:52:24.820 に答える
0

これを試してみてください。これは、別の提案よりもクリーンです(編集:メルポメネが私の前にこれについて言及していることがわかります):

typedef struct Data Data;
struct Data
{
    char *title;
};

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

C ++に移行すると、typedef行を削除できるかどうかがわかります。

相互に参照する構造体がある場合は、すべてのtypedefを一番上に移動します。

typedef Type1 Type1;
typedef Type2 Type2;

struct Type1
{
    Type2* link;
};

struct Type2
{
    Type1* link;
};
于 2013-02-26T22:57:30.060 に答える
0

structbeforeを追加する以外にLinkedList、Visual Studio で "compile as" オプションを明示的に c++ に設定する必要がある場合があります。

この C2016 エラーにしばらく悩まされていましたが、オプションを設定することで最終的に修正されました。

于 2013-07-19T03:00:17.967 に答える