在头文件中使用结构“未知类型”错误

时间:2012-04-30 14:53:19

标签: c struct header-files kdevelop

我在Kubuntu使用Kdevelop。 我在datasetup.h文件中声明了一个结构:

#ifndef A_H
#define A_H

struct georeg_val {

    int p;
    double h;
    double hfov;
    double vfov;
};

#endif

现在我在main.c文件中使用它

int main()
{
    georeg_val gval;

    read_data(gval); //this is in a .cpp file

}

我收到以下错误:

  

georeg_chain.c:7:3:错误:未知类型名称'georeg_val'

(这是georeg_val gval;行)

如果有人能帮我解决这个错误,我将不胜感激。

3 个答案:

答案 0 :(得分:27)

在C中,有一种声明结构的可能性:

struct STRUCT_NAME {} ;

typedef struct {} STRUCT_ALIAS;

如果您使用第一种方法(给结构命名) - 您必须通过将变量标记为a struct来定义变量:

struct STRUCT_NAME myStruct;

但是如果你使用第二种方法(给struct一个别名)那么你可以省略struct标识符 - 编译器可以推导出只有alias的变量类型:

STRUCT_ALIAS myStruct;

奖励积分: 您可以使用它的名称和别名声明struct:

typedef struct STRUCT_TAG {} STRUCT_TAG;
// here STRUCT_NAME == STRUCT_ALIAS

然后在变量定义中,您可以使用第一种或第二种方法。为什么两个世界都很好?结构别名允许您缩短结构变量定义 - 这有时是一件好事。但结构名称让你做forward declarations。在某些情况下哪个是不可或缺的工具 - 考虑结构之间有循环引用:

struct A {
  struct B * b;
}
struct B {
  struct A * a;
}

除了这个架构可能存在缺陷之外 - 当以第一种方式声明结构(带有名称)时,这个循环定义将被编译。通过将结构指针标记为struct来显式引用结构指针。

答案 1 :(得分:8)

如果必须定义新类型,则必须写:

typedef struct {

    int p;
    double h;
    double hfov;
    double vfov;
} georeg_val ;

然后您可以将georeg_val用作新类型。

答案 2 :(得分:4)

定义结构类型(在此示例中,为二叉搜索树结构):

struct tree { 
  int info;
  struct tree *left;
  struct tree *right;
} 

typedef struct tree treeNode;

声明一个函数,例如:

treeNode *insertElement(treeNode *treeA, int number);