在Header中声明Struct并在多个Source中使用

时间:2013-10-11 16:58:53

标签: c struct

我需要在源文件中定义一个结构,其他来源也应该能够看到它。 我在一个源文件中声明struct,然后在头文件中声明extern以包含在其他源中,但编译器跟随错误是存在的:

lcd.c(24): error:  #147: declaration is incompatible with "struct graph_obj arrow_right" (declared at line 45 of "lcd.h")

.C文件

struct graph_obj
{
    const u16   *id;
    int x,y;
    u16 w, h;
};

u32 lcdid;

struct graph_obj btn0;
struct graph_obj btn1;
struct graph_obj btn2;
struct graph_obj btn3;

然后.h文件

extern struct graph_obj
{
    const u16   *id;
    int x,y;
    u16 w, h;
};

extern u32 lcdid;

extern struct graph_obj btn0;
extern struct graph_obj btn1;
extern struct graph_obj btn2;
extern struct graph_obj btn3;

那么,我该怎么办?

2 个答案:

答案 0 :(得分:2)

您需要在头文件中声明和定义结构,然后将此标头包含到相应的源中。包含所有原型和公共结构定义的标题包含在源代码中是一个好主意和广泛应用的实践。正如另一个答案所建议的那样,“头卫”是必须具备的。

编辑:您将结构定义了2次,即错误发生的地方。 extern仅对变量有效,而不适用于原型。

答案 1 :(得分:2)

in header:  

typedef struct 
{
    const u16   *id;
    int x,y;
    u16 w, h;
}GRAPH_OBJ;


extern GRAPH_OBJ graph_obj, *pGraph_obj; 

在c模块中:

GRAPH_OBJ graph_obj, *pGraph_obj;  

与您的代码类似,除了在这里,您创建了一个新类型(GRAPH_OBJ),它将表现为任何extern'd类型。并且,您不必完全重新创建结构定义,它全部包含在GRAPH_OBJ中。顺便说一句, Here 是关于如何正确使用外部的好帖子。

相关问题