Стандарт C предоставляет два способа объявления функций. Современный способ, называемый прототипом, объявляет типы параметров. Например, void foo(char a, float b);
. Старый способ не включает типы параметров. Например, void foo();
.
В старом методе объявления функций целочисленные аргументы, меньшие, чем int
, передаются как int
(или, в некоторых случаях, как unsigned int
) и * 1008. * аргументы передаются как double
. Это возникло в основном из-за обстоятельств, в которых был разработан C, и гибкости, с которой он обрабатывал небольшие целые числа.
Если вы вызываете функцию, объявленную с прототипом, реализация C знает типы параметров и преобразует каждый аргумент в целевой тип. Если вы вызываете функцию, объявленную без прототипа, реализация C не знает истинных типов параметров в определении функции, но знает, что узкие целочисленные типы должны передаваться как int
(или unsigned int
) и float
аргументы должны быть переданы как double
. Таким образом, любые аргументы этих типов преобразуются в int
, unsigned int
или double
, в зависимости от ситуации.