dea*_*ake 15 c struct kdevelop header-files
我在Kubuntu使用Kdevelop.我在datasetup.h文件中声明了一个结构:
#ifndef A_H
#define A_H
struct georeg_val {
int p;
double h;
double hfov;
double vfov;
};
#endif
Run Code Online (Sandbox Code Playgroud)
现在当我在main.c文件中使用它时
int main()
{
georeg_val gval;
read_data(gval); //this is in a .cpp file
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
georeg_chain.c:7:3:错误:未知类型名称'georeg_val'
(这是georeg_val gval;在行)
如果有人能帮我解决这个错误,我将不胜感激.
Agn*_*kas 27
在C中,有两种可能来声明结构:
struct STRUCT_NAME {} ;
Run Code Online (Sandbox Code Playgroud)
要么
typedef struct {} STRUCT_ALIAS;
Run Code Online (Sandbox Code Playgroud)
如果你使用第一种方法(给struct一个名字) - 你必须通过明确标记它来定义变量a struct:
struct STRUCT_NAME myStruct;
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用第二种方法(给结构别名),那么您可以省略struct标识符 - 编译器可以推导出只有它的变量类型alias:
STRUCT_ALIAS myStruct;
Run Code Online (Sandbox Code Playgroud)
加分点:您可以使用它的名称和别名声明struct:
typedef struct STRUCT_TAG {} STRUCT_TAG;
// here STRUCT_NAME == STRUCT_ALIAS
Run Code Online (Sandbox Code Playgroud)
然后在变量定义中,您可以使用第一种或第二种方法.为什么两个世界都很好?结构别名允许您缩短结构变量定义 - 这有时是一件好事.但结构名称让你做forward declarations.在某些情况下哪个是不可或缺的工具 - 考虑结构之间有循环引用:
struct A {
struct B * b;
}
struct B {
struct A * a;
}
Run Code Online (Sandbox Code Playgroud)
除了这个体系结构可能有缺陷之外 - 当以第一种方式声明结构(带有名称)时,这个循环定义将被编译struct.通过将结构指针标记为显式引用结构指针.
如果必须定义新类型,则必须编写:
typedef struct {
int p;
double h;
double hfov;
double vfov;
} georeg_val ;
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用georeg_val作为新类型.