Protótipos de funções

  • 11/04/2016
  • 3 minutos para ler
    • c
    • v
    • n
    • M
    • g
    • +1

Uma declaração de função precede a definição da função e especifica o nome, tipo de retorno, classe de armazenamento, e outros atributos de uma função. Para ser um protótipo, a declaração da função também deve estabelecer tipos e identificadores para os argumentos da função.

Sintaxe

declaração:
declaração-especificadores atributeqopt init-declarator-listopt ;

/* atributeqopt é específico para Microsoft */

declaração-especificadores:
init-declarator-list, init-declarator-list

init-declarator:
declarator
declarator = initializer

declarator:
pointeropt direct-declarator

direct-declarator: /* Um declarador de função */
declarador directo ( lista de parâmetros-tipo ) /* Declarador de novo estilo */
declarador directo ( lista de identificadores ) /* Declarador de estilo obsoleto */

O protótipo tem a mesma forma que a definição da função, excepto que é terminado por um ponto e vírgula imediatamente a seguir ao parêntese de fecho e, portanto, não tem corpo. Em ambos os casos, o tipo de retorno deve concordar com o tipo de retorno especificado na definição da função.

Protótipos de função têm os seguintes usos importantes:

  • Estabelecem o tipo de retorno para funções que retornam tipos diferentes de int. Embora funções que retornam int valores não requerem protótipos, protótipos são recomendados.

  • Sem protótipos completos, conversões padrão são feitas, mas nenhuma tentativa é feita para verificar o tipo ou número de argumentos com o número de parâmetros.

  • Protótipos são usados para inicializar ponteiros para funções antes que essas funções sejam definidas.

O tipo convertido de cada parâmetro determina a interpretação dos argumentos que a chamada de função coloca na pilha. Um desajuste de tipo entre um argumento e um parâmetro pode fazer com que os argumentos na pilha sejam mal interpretados. Por exemplo, num computador de 16 bits, se um ponteiro de 16 bits for passado como argumento, então declarado como um parâmetro long, os primeiros 32 bits na pilha são interpretados como um parâmetro long. Este erro cria problemas não só com o parâmetro long, mas com quaisquer parâmetros que o sigam. Você pode detectar erros deste tipo declarando protótipos completos de funções para todas as funções.

Um protótipo estabelece os atributos de uma função para que as chamadas à função que precedem sua definição (ou ocorrem em outros arquivos fonte) possam ser checadas quanto a desajustes de tipo de argumento e tipo de retorno. Por exemplo, se você especificar o especificador de classe de armazenamento static em um protótipo, você também deve especificar a classe de armazenamento static na definição da função.

Declarações de parâmetros completas (int a) podem ser misturadas com declaradores abstratos (int) na mesma declaração. Por exemplo, a seguinte declaração é legal:

int add( int a, int );

O protótipo pode incluir tanto o tipo de, como um identificador para cada expressão que é passada como um argumento. Entretanto, esses identificadores têm escopo apenas até o final da declaração. O protótipo também pode refletir o fato de que o número de argumentos é variável, ou que nenhum argumento é passado como argumento. Sem essa lista, os desajustes podem não ser revelados, de modo que o compilador não pode gerar mensagens de diagnóstico relativas a eles. Veja Argumentos para mais informações sobre verificação de tipo.

O escopo do protótipo no compilador Microsoft C agora é compatível com ANSI quando compilando com a opção /Za do compilador. Isto significa que se você declarar uma tag struct ou union dentro de um protótipo, a tag é inserida nesse escopo ao invés de no escopo global. Por exemplo, ao compilar com /Za para conformidade com ANSI, você nunca poderá chamar esta função sem obter um erro de incompatibilidade do tipo:

void func1( struct S * );

Para corrigir seu código, defina ou declare o struct ou union no escopo global antes da função protótipo:

struct S;void func1( struct S * );

Under /Ze, a tag ainda é inserida no escopo global.

Veja também

Funções

Deixe uma resposta

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