2013-10-11 45 views
1

我需要在源文件中定義一個Structure並且其他源應該能夠看到它。 我聲明結構在一個源文件,並在標頭然後extern聲明在其他來源包括,但以下錯誤編譯器有:在Header中聲明Struct並在多個源中使用

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

你可以發佈代碼嗎?從你寫的東西來判斷你是在做一些事情。 – wirm

+0

你應該做的是在'lcd.c'中顯示錯誤的實際代碼/行,並在頭文件中顯示相應的聲明。 – crashmstr

+0

剛剛添加的代碼,tnx – Beh

回答

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是如何正確使用extern的好帖子。

+0

不客氣。順便說一下,我沒有明確說明另一個好處(雖然在鏈接中已經清楚地討論過),因爲以這種方式使用了extern修飾符,以這種方式創建的結構具有項目可見性,即成員在一個.c模塊中賦值,在使用該結構的任何其他模塊中將是相同的值。這可能很好,但如果不小心的話,它是一把雙刃劍。 – ryyker

+0

好點,tnx。所以讓我再問一個問題。不使用extern聲明會降低執行性能? – Beh

+0

我不認爲_using_,或_not using_' extern'會導致_execution_性能改變,但它會導致你的程序行爲不同。即通過以上面使用的方式使用extern,不僅可以使變量'GRAPH_OBJ'(您的結構)可用於每個.c模塊,還可以使分配給其成員的值立即可見在每個使用該結構的.c模塊中(正如我之前所說的)。但不是。我沒有看到任何使用'extern'降低性能的理由。 – ryyker

2

您需要在頭文件中聲明和定義結構,然後將此頭文件包含到相應的源文件中。將所有原型和公共結構定義包含到源代碼中的頭文件是一個好主意和廣泛應用的實踐。正如另一個答案中所建議的,「頭衛兵」是必須具備的。

編輯:你定義了結構2次,那是錯誤來自哪裏。 extern只對變量有效,不適用於原型。

+0

我應該怎麼做呢? – Beh

+0

@Beh,你應該在頭文件中聲明和定義所有的原型(公共結構,前向聲明,宏等)(在你的情況下是lcd.h)。不要忘記在標題中包括警衛,他們是你的朋友。然後你將lcd.h包含到lcd.c中。所有公開的東西都已經在lcd.h中了,你不應該在lcd.c中再次聲明它們,所以,你只需要在lcd.c中放入lcd.c(內部結構,函數定義,內部宏等)。 – wirm

相關問題