2013-04-02 64 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[];