Я читал Википедию на/заявления C C++ Prototype и я запутался:Цель C/Прототипы C++
Википедия говорит: «В том числе прототип функции, вы сообщаете компилятору, что функция„фак“принимает один целочисленный аргумент, и вы позволяете компилятору поймать такие ошибки ».
и использует ниже в качестве примера:
#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. Это имеет смысл, так как для того, чтобы старость требовала каких-то клопов, чтобы сделать что-то точно за один проход. Теперь мне кажется более очевидным. По-видимому, это требует достаточно глубокого знания того, как компилятор связывает и компилирует.
Обратите внимание, что эта статья в Википедии содержит неправильные вещи. Вы можете увидеть на странице обсуждения, как некоторые парни просто не позволят ее исправить. Я отказался от этого. –
Вот почему я определяю функции до их вызова (в любом исходном файле, во всяком случае). Это устраняет необходимость в отдельной декларации, хотя это означает, что мой код читается «назад». –