Если функция вызывается без прототипа в области видимости, компилятор сгенерирует код для вызова функции, которая принимает любые типы параметров и принимает целочисленный результат. Если параметры соответствуют тем, которые ожидает функция, и если функция возвращает свой результат способом, которым вызывающий код может обработать (*), все будет хорошо. Цель создания прототипа состоит в том, чтобы гарантировать, что аргументы преобразуются в ожидаемые типы, если это возможно, и что компиляция завершится неудачей, если их невозможно преобразовать. Например, если функция, не являющаяся прототипом, ожидает аргумент типа «long» и кто-то пытается передать «int», может произойти любое из следующего:
- Программа может аварийно завершить работу
- Вещи могут работать как положено
- Функция может выполняться так, как если бы ей было передано какое-то произвольное значение параметра
- Программа может продолжать работать, но с произвольными значениями, повреждающими любую или все программные переменные.
- Компьютер может стать причиной того, что демоны могут вылететь из носа программиста
Напротив, если бы функция была прототипирована, компилятор гарантированно сделает все необходимое для преобразования int в long до вызова функции.
Когда C был изначально задуман, прототипов не существовало, и программист отвечал за то, чтобы все аргументы передавались с ожидаемыми точными типами. На практике очень трудно убедиться, что все аргументы функции всегда являются точными правильными типами (например, при передаче значения пять в функцию, которая ожидает long, нужно записать его как «5L» или «(long) 5»). ). Реально говоря, нет (**) никаких причин полагаться на неявные типы аргументов, кроме как с помощью переменных функций.
(*) Любое из того, что может случиться с неправильными типами параметров, может происходить с неправильными типами возвращаемых значений, за исключением случаев, когда ожидается, что функция возвратит int, а фактическое возвращаемое значение функции поместится в int. результаты с большей вероятностью будут правильными, чем при использовании неверных типов параметров.
(**) Единственное исключение, о котором я могу подумать, было бы, если бы кто-то программировал для какого-то действительно старого оборудования, для которого компилятор с поддержкой прототипов был недоступен, или если он программировал для игры в гольф для кода или подобного соревнования. Последнее я считаю решением головоломок, а не программированием, и я не знаю ни одного аппаратного средства, которое люди могли бы использовать, для которого применимо первое условие.