我有以下代码:
#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语言。我在这里做错了什么?
编辑(超级道歉)
我不必要地简化了一些东西。我觉得这有助于突出显示错误代码。我原来的设置有很多代码。它也在工作。但现在它破了。所以我收集了所有相关代码并将其放在这里。我应该首先尝试将它全部放在一个文件中然后运行。我很抱歉不这样做。但是现在我已经删除了所有可能的代码并能够重现错误。这是:
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 :(得分:1)
您需要修复algorithms.h
:
#ifndef ALGORITHMS_H
#define ALGORITHMS_H
extern StackEntry *createStack();
#endif /* ALGORITHMS_H */
(extern
不是强制性的,这是一种很好的做法,但你需要这个*
)。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
正如你在评论中所说的那样,你正在使用Eclipse,我认为Eclipse试图比平时更聪明......
此代码可以发出警告(警告:typedef需要名称[-Wmissing-declarations] ,因为正如@GrzegorzSzpetkowski所解释的那样,您的第二个typedef
不包含名称和这样忽略了typedef。
但这足以打扰那些迷失的Eclipse并显示一个不存在的错误。
答案 3 :(得分:-1)
太多StackEntry
秒。你可以这样做:
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
答案 4 :(得分:-1)
我不知道这是不是答案。我希望我能发表评论,但不幸的是,我只是这个网站上的新手。我会尝试从你的struct definiton中删除typedef:
typedef struct StackEntry StackEntry;
struct StackEntry
{
int data;
StackEntry *next;
};