15

我在 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;在行)

如果有人可以帮助我解决此错误,我将不胜感激。

4

3 回答 3

29

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

struct STRUCT_NAME {} ;

或者

typedef struct {} STRUCT_ALIAS;

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

struct STRUCT_NAME myStruct;

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

STRUCT_ALIAS myStruct;

加分项:您可以使用名称和别名声明结构:

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

然后在变量定义中,您可以使用第一种或第二种方法。为什么两个世界都好?结构别名使您可以使结构变量定义更短——这有时是一件好事。但是 struct name 让你制作forward declarations. 在某些情况下这是必不可少的工具 - 考虑您在结构之间有循环引用:

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

除此之外,这种架构可能存在缺陷 - 当以第一种方式(使用名称)声明结构并且通过将结构指针标记为struct.

于 2012-04-30T16:14:01.597 回答
8

如果你必须定义一个新类型,你必须写:

typedef struct {

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

然后你可以使用 georeg_val 作为一个新类型。

于 2012-04-30T14:57:05.410 回答
4

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

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

typedef struct tree treeNode;

声明一个函数,例如:

treeNode *insertElement(treeNode *treeA, int number);
于 2013-11-17T04:02:14.180 回答