1

我需要在源文件中定义一个结构,其他来源也应该能够看到它。我在一个源文件中声明结构,然后在标头中声明 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;

所以我该怎么做?

4

2 回答 2

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),它将表现为任何外部类型。而且,您不必完全重新创建结构定义,它都包含在 GRAPH_OBJ 中。顺便说一下,是一篇关于如何正确使用外部变量的好帖子。

于 2013-10-11T17:06:14.497 回答
1

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

编辑:您定义了结构 2 次,这就是错误的来源。extern 仅对变量有效,对原型无效。

于 2013-10-11T17:03:16.873 回答