Загадка об ошибке переопределения структуры

Моя IDE — C-free 5.0, компилятор — MinGW.

У меня есть два файла: 'list.h', 'list.c'

список.ч:

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 

список.с:

#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'"

Затем я заменил все "node" на "Node", и произошли удивительные вещи! Сборка в порядке! Я действительно не могу понять это. Это может быть связано с библиотекой C?


person viperchaos    schedule 25.06.2012    source источник
comment
В C нельзя смешивать регистры, это не Perl! Выберите, либо все node, либо все Node. Нет никакой магии...   -  person Nim    schedule 25.06.2012
comment
извините за мою версию, которая вызывает ваше неправильное понимание, я исправил свой код выше   -  person viperchaos    schedule 25.06.2012
comment
Это абсолютно весь код, который вы компилируете? Мой MinGW прекрасно его компилирует.   -  person eran    schedule 25.06.2012
comment
Это не имеет значения - IDE (обычно) не компилируется, это часть компилятора. Но я запускал его с помощью командной строки, в моем случае без IDE. Каков ваш ответ относительно участия любого другого кода?   -  person eran    schedule 25.06.2012
comment
это абсолютно весь код, который я компилирую. Я пытаюсь снова и получаю ту же проблему   -  person viperchaos    schedule 25.06.2012


Ответы (2)


Дело в структуре и typedef может быть довольно запутанным, по крайней мере, для меня. Поскольку struct уже создает тип, когда вы используете компилятор, поддерживающий C++, вы должны переформулировать свои операторы. Поместите определение в заголовок вместо предварительного объявления. Именно этот "typedef struct node* ptrToNode;" который создает двойное объявление, если я не ошибаюсь. Здесь есть несколько хороших статей, в которых обсуждается тема typedef и структур. удачи

person michelmm    schedule 25.06.2012

Я думаю, что все дело в зависимости от компилятора. Он отлично работает с визуальной студией. Вы можете попробовать это следующим образом, если вы не хотите переименовывать «узел» в «узел» (я ожидаю, что он будет работать до тех пор, пока MinGW не определит свой собственный узел):

список.ч:

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;
}
person DTdev    schedule 01.08.2016