关于错误“重新定义结构”的难题

时间:2012-06-25 08:50:08

标签: c struct case-sensitive redefinition

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

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

list.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 

list.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库有关吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为这完全是编译器依赖。它适用于visual studio。如果您不想将“节点”重命名为“节点”,我可以按照以下方式尝试它(我希望它能工作,直到MinGW有自己的节点定义为somewhare):

list.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;
}