Partilhar via


Protótipos de função

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

  • declaration:
    especificadores de declaração atributo-seq optinit-Declarador-list opt**;**

    / * atributo-seq opt é específico do Microsoft * /

  • especificadores de declaração:
    especificadores de declaração de especificador de classe de armazenamento opt

    especificadores de declaração de especificador de tipo opt

    especificadores de declaração de qualificador de tipo opt

  • Init-Declarador-list:
    Declarador de init

    Init-Declarador-list , Declarador de init

  • Declarador de init:
    Declarador

    Declarador = inicializador

  • declarator:
    ponteiro optDeclarador de direct

  • Declarador de Direct: / * Declarador uma função * /
    Declarador de Direct ( lista de tipo de parâmetro ) / * Declarador de novo estilo * /

    Declarador de Direct ( - lista de identificadores de opt**)** / * Declarador obsoleto estilo * /

O protótipo tem o mesmo formato de definição de função, exceto que ele é terminado por um ponto e vírgula imediatamente após o parêntese de fechamento e, portanto, não possui corpo.Em ambos os casos, o tipo de retorno deve concordar com o tipo de retorno especificado na definição de função.

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

  • Elas estabelecem o tipo de retorno para funções que retornam tipos diferentes de int.Embora as funções que retornam int valores não necessitam de 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 o número de argumentos com o número de parâmetros.

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

  • A lista de parâmetro é usada para verificar a correspondência de argumentos na função de chamada com os parâmetros na definição de função.

O tipo convertido de cada parâmetro determina a interpretação dos argumentos que a chamada de função coloca na pilha.Uma incompatibilidade de tipo entre um argumento e um parâmetro pode fazer com que os argumentos na pilha a fim de ser mal interpretado.Por exemplo, em um computador de 16 bits, se um ponteiro de 16 bits é passado como um argumento, em seguida, declarado como um longo parâmetro, os primeiros 32 bits na pilha são interpretados como uma longo parâmetro.Este erro cria problemas não somente com o longo parâmetro, mas com todos os parâmetros que o seguem.Você pode detectar erros desse tipo, declarando protótipos de função completa para todas as funções.

Um protótipo estabelece os atributos de uma função para que as chamadas para a função que precedem a sua definição (ou ocorrerem em outros arquivos de origem) podem ser verificadas para o tipo de argumento e incompatibilidades de tipos de retorno.Por exemplo, se você especificar o estático o especificador de classe de armazenamento em um protótipo, você também deve especificar o estático classe de armazenamento na definição de função.

Conclua a declaração de parâmetro (int a) pode ser misturado com abstratas declaradores (int) na mesma declaração.Por exemplo, a declaração a seguir é legal:

int add( int a, int );

O protótipo pode incluir o tipo de e um identificador para cada expressão que é passada como um argumento.No entanto, esses identificadores têm escopo somente 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 não há argumentos são passados.Sem uma lista como essa, incompatibilidades podem não ser reveladas, para que o compilador não pode gerar mensagens de diagnóstico sobre eles.Consulte argumentos para obter mais informações sobre a verificação de tipo.

Escopo de protótipo no compilador Microsoft C agora é compatível com ANSI durante a compilação com a opção de compilador /Za.Isso significa que, se você declarar um struct ou união marca dentro de um protótipo, a tag é inserida no escopo, em vez de no escopo global.Por exemplo, durante a compilação com /Za para fins de conformidade ANSI, você nunca pode chamar esta função sem atrapalhar a um erro de incompatibilidade de tipo:

void func1( struct S * );

Para corrigir seu código, definir ou declarar a struct ou união no escopo global antes do protótipo de função:

struct S;
void func1( struct S * );

Em /Ze, a marca ainda é inserida no escopo global.

Consulte também

Conceitos

Funções (C)