Ошибка конфликтующих типов при компиляции 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 перед основной функцией, все будет хорошо.
Так может кто-нибудь объяснить, почему проблема происходит?
Спасибо!
Ответы
Ответ 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
Чтобы ответить на более общий случай, эта ошибка замечается при выборе имени функции, которое уже используется в некоторой встроенной библиотеке. Например, выберите.
Простой способ узнать об этом - при компиляции файла, компилятор укажет предыдущее объявление.