Без объявления, которое более конкретно является прототипом (объявление с указанными типами параметров), вы полагаетесь на неявное объявление без прототипа функции (которая теперь является устаревшей функцией C).
Неявный прототип для функции f
равен int f()
- функция, возвращающая int
и принимающая неопределенное количество параметров.
Способ вызова функций без прототипов - аргументы повышен (меньше чем int
целочисленных типов до int
и float
с до double
с) и передан функции определенным реализацией способом.Если аргументы не соответствуют определению, поведение не определено (ваш случай).
Вы можете исправить это (все еще полагаясь на неявное объявление), предоставив явное приведение:
#include<stdio.h>
//nothing (probably will get a compiler warning) or
int add(); /*=params unspecified*/
int main(void) {
printf("%d\n", add((int)10.5, (int)20.5));
}
, тем самым удаляя UB (неопределенное поведение), или вы можете включить прототип, как у вас, что заставит компилятор преобразовывать переданные значения float
s для соответствия ожидаемым типам (int
).Другими словами, с прототипом компилятор вставит эти приведения для вас, видя, что преобразование из float
в int
в (аргумент) присваивания.
Предпочтительный способ решить это с помощьюпрототип, включенный через заголовок, который также включен в файл реализации (Add.c), чтобы позволить компилятору проверить вызов в соответствии с определением.