Por que usar protótipos de função?

Por que usar protótipos de função em C? Parece meio redundante porque já declaramos o nome da função, os tipos de argumento e o tipo de retorno na definição. Os protótipos precisam ser declarados antes que a função seja definida ou usada para otimizações?