Protótipo de função

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.

Deixe uma resposta

O seu endereço de email não será publicado.