我在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;
行)
如果有人能帮我解决这个错误,我将不胜感激。
答案 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);