Помимо прототипа функции существует и просто определение функции, что мешает компилятору получить информацию именно из такого источника? Наверное они нужны для того, чтобы определить классы памяти под те или иные объекты программы, а также разрулить всякие бяки с областью видимости объектов.