ошибка конфликтующих типов при компиляции c программы с использованием gcc - PullRequest
20 голосов
/ 17 апреля 2011

Я попытался скомпилировать следующую программу с помощью gcc.

0 #include  <stdio.h>
1 
2 main ()
3
4 {    
5  char my_string[] = "hello there";      
6
7  my_print (my_string);    
8  my_print2 (my_string);    
9}
10   
11 void my_print (char *string)
12 {    
13  printf ("The string is %s\n", string);    
14 }
15        
16 void my_print2 (char *string)
17 {
18  char *string2;    
19  int size, i;   
20
21  size = strlen (string);    
22  string2 = (char *) malloc (size + 1);
23
24  for (i = 0; i < size; i++)    
25    string2[size - i] = string[i];
26
27   string2[size+1] = '\0';    
28   printf ("The string printed backward is %s\n", string2);    
29 }

Однако происходит сбой, и компилятор создает следующий журнал ошибок:

  1. reeting.c: 11: ошибка: конфликт типов для my_print
  2. reeting.c: 7: ошибка: предыдущая неявная декларация my_print была здесь
  3. reeting.c: 16: ошибка: конфликт типов для 'my_print2'
  4. reeting.c: 8: erroro: там было предыдущее неявное объявление my_print2

И если я перемещу функции my_print и my_print2 перед основной функцией, все идет хорошо. Так может кто-нибудь объяснить, почему проблема возникает? Спасибо!

Ответы [ 3 ]

39 голосов
/ 17 апреля 2011

Если вы не объявляете функцию и она появляется только после вызова, она автоматически считается равной int, поэтому в вашем случае вы не объявляли

void my_print (char *);
void my_print2 (char *);

перед вамивызовите его в main, поэтому компилятор предполагает, что есть функции, прототипы которых int my_print2 (char *); и int my_print2 (char *);, и вы не можете иметь две функции с одинаковым прототипом, кроме возвращаемого типа, поэтому вы получаете ошибку conflicting types.

Как предложил Брайан, объявите эти два метода перед main.

9 голосов
/ 17 апреля 2011

Вы должны объявить свои функции до main()

(или объявить прототипы функций до main())

Как таковой, компилятор видит my_print (my_string); в main() как объявление функции.

Переместите ваши функции выше main() в файле или введите:

void my_print (char *);
void my_print2 (char *);

Выше main() в файле.

2 голосов
/ 30 сентября 2015

Чтобы ответить на более общий случай, эта ошибка замечена, когда вы выбираете имя функции, которое уже используется в некоторой встроенной библиотеке.Например, выберите.

Простой способ узнать об этом при компиляции файла, компилятор укажет предыдущее объявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...