2013-04-02 66 views
-1

我有如下編譯問題。頭文件abc.h包含在abc.c中。爲什麼這是相沖突的類型聲明?

在頭文件中,我有這個

extern char **foo; 
在源文件中

,我有這個

char *foo[] = { ".mp3", ".mp4" }; 

但我從GCC得到一個編譯錯誤:

abc.c:23:7: error: conflicting types for ‘foo’ 
In file included from abc.c:18:0: 
abc.h:64:15: note: previous declaration of ‘foo’ was here 

爲什麼我得到這個錯誤?

回答

5

一個是指針數組,另一個是指向指針的指針。非常不同的對象。嘗試宣告它作爲一個數組:

extern char *foo[]; 
+0

@KingWeeWee事情在函數聲明中的工作方式不同:-) – cnicutar

+0

我的意思是,char * p與char [] p相同。好的,謝謝 – KingWeeWee

+0

@KingWeeWee:你錯了,他們不是同一類型。當編譯器看到一個外部符號的類型爲「未指定大小的X數組」時,它實際上要鏈接的是該數組的地址,該數組的起始地址與其第一個元素相同。不過,該類型與指向該第一個元素的指針的類型不同。 –

0

extern char[]extern char *是兩個不同的

而對於的extern聲明應該用一個定義匹配。

extern char **foo; 

比賽

char **foo; 

不匹配

char *foo[]; 

同樣的事情

extern char *foo[]; /* matches */ 
char *foo[];