我的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库有关吗?
答案 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;
}