2013-04-02 3 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 char **foo; 

матчи

char **foo; 

не соответствует

char *foo[]; 

же

extern char *foo[]; /* matches */ 
char *foo[]; 
Смежные вопросы