Um protótipo de função ou declaração de função, nas linguagens de programação C e C++, é uma declaração de uma função que omite o corpo mas especifica o seu nome, aridade, tipos de argumentos e tipo de retorno. Um protótipo de função pode ser entendido como a especificação da sua interface.
A definição da função, em contrapartida, é a estrutura que além de conter a as informações de interface aqui descritas, possui o corpo onde é especificado o que a função realiza, O conceito de protótipo de função foi proposto originalmente na linguagem C++ e foi adotado posteriormente no padrão ANSI C da linguagem C.[1][2]
Exemplo
Como um exemplo, pode-se considerar o seguinte protótipo de função:
int fac(int n);
Este protótipo especifica que neste programa, existe uma função de nome "fac" que utiliza um único parâmetro "n" que está declarado como tipo inteiro "int". A definição da função precisa ser disponibilizada para que a função possa ser utilizada.
Usos
Se a função não for declarada previamente e o seu nome ocorre em alguma expressão seguida de um parêntese ("(
"), ela é declarada implicitamente como uma função sem nenhum argumento que retorna um int
. Neste caso, quando a função é aplicada a algum argumento, o compilador não será capaz de realizar uma verificação, em tempo de compilação, dos tipos dos argumentos e da aridade. A impossibilidade de verificar o uso correto de uma função comumente implica a ocorrência de erros.
#include <stdio.h>
/*
* Se o protótipo é disponibilizado, o compilador irá detectar o erro
* na função main(). Se ele é omitido, o erro não será notificado.
*/
int fac(int n); /* Protótipo da função "fac" */
int main() /* Chamada da função "main" */
{
printf("%d\n", fac()); /* ERRO: falta um argumento na chamada de "fac" */
return 0;
}
/*
* Definição da função "fac"
*/
int fac(int n) /* Chamada da função "fac" */
{
if (n == 0) {
return 1;
}
else {
return n * fac(n - 1);
}
}
A função "fac" espera que um argumento inteiro esteja na sua pilha de execução quando é chamada. Se o protótipo é omitido, o compilador não terá como garantir a presença do argumento e a função "fac" acabará operando sobre algum outro dado existente na pilha (possivelmente um código de retorno) ou um valor de alguma variável que não está no escopo corrente. Incluindo o protótipo da função, o programador informa ao compilador que a função "fac" obtém um inteiro como argumento e permite que o compilador avise a ocorrência desse tipo de erro.
Criação de interfaces de biblioteca
Através da utilização de protótipos de função em arquivos de cabeçalho (normalmente, em programas escritos na linguagem C, em arquivos com a extensão ".h") é possível especificar interfaces para bibliotecas de software.
Declarações de classe
Na linguagem C++, os protótipos de função são também utilizados em declarações de classe.
Referências
Bibliografia
Ver também