错误:初始化类型'struct ...'时出现不兼容的类型

时间:2016-03-25 12:01:23

标签: c struct typedef

我有以下代码:

#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;
}

5 个答案:

答案 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;
};