Em versões anteriores de C, se uma função não foi declarada previamente e seu nome ocorreu em uma expressão seguida por um parêntese à esquerda, ela foi implicitamente declarada como uma função que retorna um int
e nada foi assumido sobre seus argumentos. Neste caso o compilador não seria capaz de executar a verificação em tempo de compilação dos tipos de argumentos e da aritmética da sintaxe quando a função fosse aplicada a alguns argumentos. Isto pode causar problemas. O seguinte código ilustra uma situação na qual o comportamento de uma função implicitamente declarada é indefinido.
#include <stdio.h>/* If this prototype is provided, the compiler will catch the error in * |main|. If it is omitted, then the error may go unnoticed. */int MyFunction(int n); /* Prototype */int main( void ) /* Calling function */{ printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */ return 0;}int MyFunction( int n ) /* Called function definition */{ if (n == 0) { return 1; } else { return n * MyFunction(n - 1); }}
A função MyFunction espera que um argumento inteiro esteja na pilha ou em um registro quando ele é chamado. Se o protótipo for omitido, o compilador não terá nenhuma maneira de reforçar isto e MyFunction acabará operando em algum outro dado na pilha (possivelmente um endereço de retorno ou o valor de uma variável que não está atualmente no escopo). Ao incluir o protótipo da função, você informa o compilador que a função MyFunction pega um argumento inteiro e você habilita o compilador a pegar este tipo de erros e fazer o processo de compilação correr sem problemas. Esta funcionalidade foi removida do padrão C99, assim a omissão de um protótipo de função resultará em um erro de compilação.
Criando interfaces de bibliotecaEditar
Colocando protótipos de função em um arquivo de cabeçalho, pode-se especificar uma interface para uma biblioteca.
Declaração de classeEditar
Em C++, os protótipos de função também são usados em definições de classe.