2016-03-25 3 views
-1

я следующий код:ошибка: несовместимые типы при инициализации типа "структура ...

#include "stdio.h" 

typedef struct StackEntry StackEntry; 
typedef struct StackEntry 
{ 
    int data; 
    StackEntry *next; 
}; 

StackEntry* createStack() 
{ 
    return NULL; 
} 

int main() 
{ 
    StackEntry *stack = createStack(); //Error: incompatible types when initializing type 'struct StackEntry *' using type 'StackEntry' 
} 

Я получаю ошибку incompatible types when initializing type 'struct StackEntry *' using type 'StackEntry', как показано выше. Я пересматриваю C через долгое время. Что я здесь делаю неправильно?

Edit (Супер извинения)

я излишне упрощен материал. Я чувствовал, что это поможет выделить код ошибки. У моей исходной настройки было много кода. Он тоже работал. Но теперь он сломался. Поэтому я собрал весь связанный код и поместил его сюда. Я должен был сначала попробовать положить все это в один файл и запустить. Мне очень жаль, что я этого не делал. Но теперь я удалил весь возможный код и смог воспроизвести ошибку. Вот оно:

algorithms.h

#ifndef ALGORITHMS_H_ 
#define ALGORITHMS_H_ 

StackEntry createStack(); 

#endif /* ALGORITHMS_H_ */ 

datastructures.h

#ifndef DATASTRUCTURES_H_ 
#define DATASTRUCTURES_H_ 

typedef struct StackEntry StackEntry; 

struct StackEntry 
{ 
    int data; 
    StackEntry *next; 
}; 
#endif /* DATASTRUCTURES_H_ */ 

stack.c

#include "datastructures.h" 
#include "stdio.h" 

StackEntry* createStack() 
{ 
    return NULL; 
} 

main.C

#include "datastructures.h" 
#include "algorithms.h" 

int main() 
{ 
    StackEntry *stack = createStack(); //Error: incompatible types when initializing type 'struct StackEntry *' using type 'StackEntry' 
    return 0; 
} 
+0

Почему второй typedef есть, так как он будет игнорироваться? –

+0

У вас все еще есть ошибка после удаления бесполезного второго 'typedef'? – jdarthenay

+0

Ах, я пропустил это ...он не должен быть там ... btw почему компилятор не считал это ошибкой ...? – Mahesha999

ответ

1

Вам необходимо исправить algorithms.h:

#ifndef ALGORITHMS_H 
#define ALGORITHMS_H 

extern StackEntry *createStack(); 

#endif /* ALGORITHMS_H */ 

(extern не является обязательным, это хорошая практика, но вам это нужно *).

-1

Слишком много StackEntry s. Вы можете сделать это:

struct _StackEntry; // there is such a struct, no matter where. 

struct _StackEntry { 
    int a; 
    _StackEntry *next; // now the compiler knows that this is a valid type 
} 

typedef _StackEntry StackEntry; // add an alias of this type 
+0

Идентификаторы, начинающиеся с символа подчеркивания +, зарезервированы во всех контекстах. Идентификаторы, начинающиеся с символа подчеркивания, зарезервированы в области файлов. (C11 7.1.2) В действительности нет причин не использовать одно и то же имя для тега struct и typedef, поскольку они находятся в разных пространствах имен; давая тегу украшенное имя, просто добавляет путаницу. – Leushenko

+0

lol, говорит «Слишком много StackEntrys», затем отправляет код с еще большим количеством StackEntry, чем исходный код –

+0

@Leushenko, это не должно добавить слишком много путаницы, поскольку, насколько я понимаю, в коде будет использоваться только «StackEntry» , и тип с подчеркиванием будет просто не смущать кого-либо. – ForceBru

-1

Я не знаю, если это ответ. Хотел бы я прокомментировать, но, к сожалению, я просто новичок на этом сайте. Я хотел бы попробовать удаления ЬурейеЕ из вашей структуры Definiton:

typedef struct StackEntry StackEntry; 
struct StackEntry 
{ 
    int data; 
    StackEntry *next; 
}; 
+0

Удаление 'typedef' - хорошая идея, однако это не повлияло, поэтому это не должно меняться. –

0

ниже код компилирует ОК - надеюсь, что это помогает (VSTO 2013 консольного приложения)

#include "stdafx.h" 


typedef struct StackEntry 
{ 
    int data; 
    StackEntry *next; 
}; 

StackEntry* createStack() 
{ 
    return NULL; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    StackEntry *stack = createStack(); 
    return 0; 
} 
0

Как вы сказали в комментариях, что вы используете Eclipse, Я думаю, что Eclipse, пытается быть более умным, чем это, как обычно ...

Этот код может дать предупреждение (предупреждение: ЬурейеЕ требует имя [-Wmissing декларирование], потому что, как объясняется @GrzegorzSzpetkowski ваш второй typedef не включает имя и т. Д. Игнорирует typedef.

Но этого достаточно, чтобы повредить Eclipse, которые заблудятся и показывают несущественную ошибку.

Смежные вопросы