Я читал wikipedia в инструкциях прототипа C/С++, и я смущен:
Википедия говорит: "Включив прототип функции, вы сообщаете компилятору, что функция" fac "принимает один целочисленный аргумент, и вы позволяете компилятору поймать такие ошибки".
и использует в качестве примера следующее:
#include <stdio.h>
/*
* If this prototype is provided, the compiler will catch the error
* in main(). If it is omitted, then the error will go unnoticed.
*/
int fac(int n); /* Prototype */
int main(void) { /* Calling function */
printf("%d\n", fac()); /* ERROR: fac is missing an argument! */
return 0;
}
int fac(int n) { /* Called function */
if (n == 0)
return 1;
else
return n * fac(n - 1);
}
Но определение функции вызываемой функции уже включает в себя всю информацию, которую прототип сообщает компилятору, поэтому почему компилятор не может вывести эту информацию из определения вызываемой функции, поскольку они содержат одинаковые утверждения/информационное письмо для буквы?
Что мне не хватает? Похоже на дополнительную работу без очевидного выигрыша.
Редактировать: Спасибо, ребята. Я предполагал, что компиляторы были многопроходными, я думаю. Я испорчен на нынешних языках, таких как Python. Это имеет смысл, так как ему так нужно, чтобы некоторые клопы делали точные вещи за один проход. Теперь мне кажется более очевидным. По-видимому, это требует достаточно глубокого знания того, как компилятор связывает и компилирует.