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 optespecificadores de declaração de especificador de tipo opt
especificadores de declaração de qualificador de tipo opt
Init-Declarador-list:
Declarador de initInit-Declarador-list , Declarador de init
Declarador de init:
DeclaradorDeclarador = inicializador
declarator:
ponteiro optDeclarador de directDeclarador 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.