错误:类型" HNode *"的参数与参数类型" HNode *"不兼容

时间:2014-07-01 08:18:20

标签: c struct typedef

我刚刚开始编写我的代码,因为它没有编译而且我不知道原因并不重要,它说:Error: argument of type "HNode *" is incompatible with parameter type "HNode *"就行了: getSL(root->left);。我真的不明白为什么会这样。我正在使用Visual Studio 2012进行编译。

我的代码(是的,没有完成):

#include <stdio.h>
#include <stdlib.h>
typedef struct {
  char chr;
  struct HNode *left, *right;
} HNode;
typedef struct {
  char chr;
  int counter;
} Symbol;

int main()
{

}
Symbol * getSL(HNode * root)
{
    Symbol * s;
    if(!root) return NULL;
    if((!(root->left)) && (!(root->right)))
    {

    }
    else
    {
        getSL(root->left);
    }
}

你能向我解释一下我做错了什么以及如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

使用这样的前瞻声明:

struct HNode;              //forward declaration
typedef struct HNode{      //note the struct tag here
  char chr;
  struct HNode *left, *right;
} HNode;

答案 1 :(得分:1)

为名为HNode的结构创建一个typedef。在该结构中,您有一个指向struct HNode的指针。

typedef struct {
 char chr;
  struct HNode *left, *right;
} HNode;

类型struct HNodeHNode的类型不同。 struct HNode是一个不完整的结构(编译器不知道)。如果您这样做,您的代码将是相同的:

typedef struct {
 char chr;
  struct Something *left, *right;
} HNode; 

在上面的示例中,struct HNode根本不存在。

解决此问题的一种简单方法是单独创建struct和typedef。

typedef struct HNode_s HNode ;

struct HNode_s{
 char chr;
  HNode *left, *right;
} ;

答案 2 :(得分:1)

您输入HNode的结构实际上没有名称(您只说struct,而不是struct HNode),并且在定义期间,typedef尚不存在,所以你最终创建了两个不同的结构,一个名为HNode,一个名称定义为HNode

您可以通过预先声明结构,然后在其定义中正确命名它来避免这种情况。

struct HNode; // declare the named struct (not needed with C++ compiler)

typedef struct HNode { // define the named struct
  char chr;
  struct HNode *left, *right;
} HNode; // typedef to a shorter name