Quickfix:
Убедитесь, что ваши функции объявлены один раз и только один раз, прежде чем они будут вызваны. Например, изменить:
main(){ myfun(3.4); }
double myfun(double x){ return x; }
Кому:
double myfun(double x){ return x; }
main(){ myfun(3.4); }
Или добавить отдельное объявление функции:
double myfun(double x);
main(){ myfun(3.4); }
double myfun(double x){ return x; }
Возможные причины ошибки
- Функция была вызвана до объявления
- Определенная функция переопределяет функцию, объявленную во включенном заголовке.
- Функция была определена дважды в одном файле
- Декларация и определение не совпадают
- Объявление конфликта во включенных заголовках
Что на самом деле происходит
error: conflicting types for ‘foo’
означает, что функция была определена более одного раза с разными сигнатурами типов.
Файл, содержащий две функции с одинаковыми именами, но с разными типами возвращаемых значений, выдает эту ошибку, например:
int foo(){return 1;}
double foo(){return 1.0;}
Действительно, при компиляции с GCC мы получаем следующие ошибки:
foo.c:5:8: error: conflicting types for ‘foo’
double foo(){return 1.0;}
^
foo.c:4:5: note: previous definition of ‘foo’ was here
int foo(){return 1;}
^
Теперь, если бы вместо этого у нас был файл с двумя определениями функций с одинаковым именем
double foo(){return 1;}
double foo(){return 1.0;}
Вместо этого мы получили бы ошибку 'redefinition':
foo.c:5:8: error: redefinition of ‘foo’
double foo(){return 1.0;}
^
foo.c:4:8: note: previous definition of ‘foo’ was here
double foo(){return 1;}
^
Неявное объявление функции
Так почему следующий код выдает error: conflicting types for ‘foo’
?
main(){ foo(); }
double foo(){ return 1.0; }
Причина: неявное объявление функции .
Когда компилятор впервые встретит foo()
в функции main
, он примет сигнатуру типа для функции foo
из int foo()
. По умолчанию предполагается, что неявные функции возвращают целые числа, а типы входных аргументов являются производными от того, что вы передаете в функцию (в данном случае - ничего).
Очевидно, что компилятор ошибочен, чтобы сделать это предположение, но спецификации языка C (и, следовательно, Objective-C) старые, капризные и не очень умные. Может быть, неявное объявление функций сэкономило время на разработку, снизив сложность компилятора, но теперь мы застряли с ужасной функцией, которая никогда не должна была попасть в язык. Фактически, неявные декларации были объявлены незаконными в C99.
Тем не менее, когда вы знаете, что происходит, должно быть легко найти основную причину вашей проблемы.