定义结构时出错

时间:2013-08-31 05:07:24

标签: c struct typedef

我正在尝试编写一个简单的链接列表,仅用于练习并稍微调整一下我的记忆,但是我遇到了麻烦。我对C很缺乏经验,我不明白为什么这不起作用。我正在尝试定义一个Node和一个LinkedList结构,但每次我尝试编译时都会收到错误,说Node是一个未知类型。我确定我错过了一些东西,但我无法理解这一点。谢谢大家!

这是我的ll.h文件

  1 #ifndef ll_h
  2 #define ll_h
  3 
  4 #include <stdio.h>
  5 
  6 typedef struct {
  7     void *data;
  8     Node *next;
  9     Node *prev;
 10 } Node;
 11 
 12 
 13 typedef struct {
 14     Node *first;
 15     Node *last;
 16     int size;
 17 } LinkedList;
 18 
 19 
 20 void *getData(LinkedList list, int index);
 21 int getSize(LinkedList list);
 22 void *deleteNode(LinkedList, int index);
 23 void add(LinkedList list, void *data);
 24 void freeList(LinkedList list);
 25 
 26 #endif           

我收到的错误

cc -Wall -g   -c -o ll.o ll.c
In file included from ll.c:3:0:
ll.h:8:5: error: unknown type name ‘Node’
ll.h:9:5: error: unknown type name ‘Node’
ll.c: In function ‘getData’:
ll.c:8:18: error: expected expression before ‘LinkedList’
ll.c:12:7: warning: assignment from incompatible pointer type [enabled by default]
ll.c: In function ‘getSize’:
ll.c:21:12: error: expected expression before ‘LinkedList’
ll.c: In function ‘deleteNode’:
ll.c:26:18: error: expected expression before ‘LinkedList’
ll.c:32:7: warning: assignment from incompatible pointer type [enabled by default]
ll.c:37:12: error: request for member ‘next’ in something not a structure or union
ll.c:38:12: warning: assignment from incompatible pointer type [enabled by default]
ll.c:40:12: error: request for member ‘next’ in something not a structure or union
ll.c: In function ‘add’:
ll.c:52:16: warning: assignment from incompatible pointer type [enabled by default]
ll.c:54:21: warning: assignment from incompatible pointer type [enabled by default]
ll.c: In function ‘freeList’:
ll.c:61:18: error: expected expression before ‘LinkedList’
ll.c:62:18: warning: initialization from incompatible pointer type [enabled by default]
ll.c:65:7: warning: assignment from incompatible pointer type [enabled by default]
ll.c:67:7: warning: assignment from incompatible pointer type [enabled by default]
ll.c:62:11: warning: variable ‘next’ set but not used [-Wunused-but-set-variable]
ll.c:60:9: warning: unused variable ‘i’ [-Wunused-variable]
ll.c: In function ‘main’:
ll.c:85:6: error: ‘LinkedList’ has no member named ‘add’
ll.c:91:10: warning: dereferencing ‘void *’ pointer [enabled by default]
ll.c:91:10: error: void value not ignored as it ought to be
ll.c: In function ‘getSize’:
ll.c:22:1: warning: control reaches end of non-void function [-Wreturn-type]
make: *** [ll.o] Error 1

3 个答案:

答案 0 :(得分:2)

使用此:

typedef struct Node{
     void *data;
     struct Node *next; // note here
     struct Node *prev;
} Node;

答案 1 :(得分:2)

您需要转发声明,或者您需要删除typedef。你也可以使用typedef让节点两次。

转发声明

typedef struct Node Node; // Necessary in C, harmless (but non-idiomatic) in C++

typedef struct {
    void *data;
    Node *next;
    Node *prev;
} Node;

没有typedef(仅适用于C ++,而不适用于C)

struct Node {
    void *data;
    Node *next;
    Node *prev;
};

使用带标记

的typedef

适用于C和C ++,但不适用于C ++。

typedef struct Node {
    void *data;
    struct Node *next;
    struct Node *prev;
} Node;

答案 2 :(得分:0)

为Google搜索带来的下一位读者发布答案:
error: void value not ignored as it ought to be

请记住,在尝试实现伪代码时,函数指针会使用函数名称进行初始化而不带任何括号。菜鸟错了吗?也许,但我不是新手(90年代中期在大学教过C / C ++实验室)而且它让我受益匪浅。如果我键入它而不是剪切粘贴,我可能会发现错误,因为我知道不会创建该代码......

提供完整性声明的示例:

//  Static menu manager
#define MAX_SELECTIONS 4
#define MAX_PROMPT_LEN 20
typedef struct _selection {
    char prompt[MAX_PROMPT_LEN];
    void(*function) ( void );
    int fn_arg;
} SELECTION ;

typedef struct _menu {
    int id;
    int num_selections;
    SELECTION selection[MAX_SELECTIONS];
} MENU;

enum _menu_ids { MAIN_MENU, DEPOSIT_MENU, WITHDRAWL_MENU, BALANCE_MENU };
enum _menu_keys { DEPOSIT, WITHDRAWL, BALANCE, CHECKING, SAVINGS };



错:

//  WRONG
static MENU menu[] = {
    { MAIN_MENU, 4,
        {"Perform A Deposit", goto_menu(), DEPOSIT_MENU},
        {"Perform a Withdrawl", goto_menu(), WITHDRAWL_MENU },
        {"Get Balance", goto_menu(), BALANCE_MENU },
        {"Hide Menu", menu_hide(), 0}
    }
}



正确:

//  Correct
static MENU menu[] = {
    { MAIN_MENU, 4, {
        {"Perform A Deposit", goto_menu, DEPOSIT_MENU},
        {"Perform a Withdrawl", goto_menu, WITHDRAWL_MENU },
        {"Get Balance", goto_menu, BALANCE_MENU },
        {"Hide Menu", menu_hide, 0} }
    }
}

特别敏锐的读者可能会注意到伪代码中缺少初始化struct的{​​{1}}成员所需的额外括号。 gcc编译器足以提供有用的错误:
array