(Non-variadic) параметры для функций с прототипом преобразуются в соответствующий тип, который может быть char, short, float.
Параметры для функций без прототипа и параметров с переменными параметрами подвергаются продвижению по умолчанию для аргументов.
Если вы определили функцию с прототипом и используете ее без прототипа или наоборот, и она имеет параметры типа char, short или float, у вас, вероятно, будут проблемы во время выполнения. У вас будут такие же проблемы с переменными функциями, если повышенный тип не совпадает с тем, который используется при чтении списка аргументов.
Пример 1: проблема при определении функции с прототипом и использовании ее без.
definition.c
void f(char c)
{
printf("%c", c);
}
use.c
void f();
int main()
{
f('x');
}
может потерпеть неудачу, потому что будет передано int и функция ожидает символ.
Пример 2: проблема при определении функции без прототипа и использовании ее с одним.
definition.c
void f(c)
char c;
{
printf("%c", c);
}
(Это определение очень старомодно)
use.c
void f(char c);
int main()
{
f('x');
}
может потерпеть неудачу, потому что ожидается int, но будет передан символ.
Примечание: вы заметите, что все функции из стандартной библиотеки имеют типы, которые являются результатом продвижений по умолчанию. Таким образом, они не вызывали проблем при переходе, когда были добавлены прототипы.