Вызовы функций в C не требуют, чтобы прототип был видимым, но настоятельно рекомендуется, чтобы в области видимости находился правильный прототип.
Причина этого заключается в том, что если определение функции не соответствуеттипы аргументов функции после выполнения продвижений аргументов функции по умолчанию весьма вероятно, что вы получите неопределенное поведение.
Наличие правильного видимого прототипа означает, что компилятор может проверить аргументы вызова функции и предупредить программиста, еслиимеется несоответствие.
C не допускает перегрузки функций, поэтому вы можете иметь только один прототип для любого имени функции.
Повышение аргументов по умолчанию может привести к неожиданным несовпадениям.
Например,
int main(int argc, char **argv)
{
short s = 5;
float f = 2.3f;
x(s, f); // x implicitly declared; default argument promotions performed
return 0;
}
int x(short t, float g) // Error: called with an int and a double
{
return (int)(t + g);
}
В вызове функции, поскольку x
не имеет видимого прототипа (пока), s
будет повышен до int
, а f
будет увеличен до double
.Это продвижение аргументов по умолчанию .Это тогда вызывает несоответствие, когда функция определена с прототипом, который принимает short
и float
, даже если это оригинальные типы аргументов, которые были переданы.
Функции, которые принимают переменнуюколичество аргументов (т. е. использование синтаксиса , ...
) всегда должно иметь видимый прототип в той точке, в которой они вызываются.