2

我的 IDE 是C-free 5.0,编译器是MinGW

我有两个文件:'list.h','list.c'

列表.h:

typedef int elementType; 
#ifndef _LIST_H
#define _LIST_H

struct node;

typedef struct node* ptrToNode;
typedef ptrToNode list;
typedef ptrToNode position;

list makeEmpty(list l);
#endif 

列表.c:

#include <stdio.h> 
#include "list.h"
#include <stdlib.h>

struct node{
    elementType element;
    position next;
};

list makeEmpty(list l){
if(l == NULL){
    //delete list
}
l = malloc(sizeof(struct node));
if(l == NULL){
    printf("fail to malloc memory");
    exit(-1);
}
l->next = NULL;
return l;
}

我尝试编译这些文件然后出现错误

"list.c:5: redefinition of 'struct node'"

然后我将所有的“节点”替换为“节点”,神奇的事情发生了!编译正常!我真的无法理解这一点。这可能与C库有关吗?

4

2 回答 2

1

至少对我来说,关于 struct 和 typedef 的事情可能非常令人困惑。由于 struct 在您使用 C++ 感知编译器时已经创建了一个类型,因此您必须重新编写您的语句。将定义推入标题而不是前向声明。就是这个“typedef struct node* ptrToNode;” 如果我没记错的话,它会创建双重声明。这里有很多很好的文章讨论关于 typedef 和结构的主题。祝你好运

于 2012-06-25T09:59:30.467 回答
0

我认为这都是编译器依赖。它适用于视觉工作室。如果您不想将“node”重命名为“Node”,您可以尝试以下方式(我希望它能够工作,直到 MinGW 定义了自己的节点):

列表.h:

typedef int elementType; 
#ifndef _LIST_H
#define _LIST_H


typedef struct node{
    elementType element;
    struct node* next;
}*ptrToNode;


//typedef struct node* ptrToNode;
typedef ptrToNode list;
typedef ptrToNode position;

list makeEmpty(list l);
#endif 

和你的清单.c

#include <stdio.h> 
#include "poly.h"
#include <stdlib.h>


list makeEmpty(list l){
if(l == NULL){
    //delete list
}
l = malloc(sizeof(struct node));
if(l == NULL){
    printf("fail to malloc memory");
    exit(-1);
}
l->next = NULL;
return l;
}
于 2016-08-01T12:11:47.857 回答