Подтвердить что ты не робот

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

Я попытался скомпилировать следующую программу с 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 }

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

  • greeting.c: 11: ошибка: конфликтующие типы для 'my_print'
  • greeting.c: 7: error: предыдущее неявное объявление 'my_print' было здесь
  • greeting.c: 16: ошибка: конфликтующие типы для 'my_print2'
  • greeting.c: 8: erroro: предыдущее неявное объявление 'my_print2' было там

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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