Parâmetros

Os argumentos são nomes de valores transmitidos a uma função por uma chamada de função. Os parâmetros são os valores que a função espera receber. Em um protótipo de função, os parênteses posteriores ao nome da função contêm uma lista completa dos parâmetros da função e seus tipos. As declarações de parâmetro especificam os tipos, os tamanhos e os identificadores dos valores armazenados nos parâmetros.

Sintaxe

function-definition:
declaration-specifiersopt attribute-seqopt declarator declaration-listopt compound-statement

/* attribute-seq é específico da Microsoft */

declarator:
pointeropt direct-declarator

direct-declarator: /* Um declarador de função */
direct-declarator ( parameter-type-list ) /* Novo declarador de estilo */
direct-declarator ( identifier-listopt ) /* Declarador de estilo obsoleto */

parameter-type-list: /* A lista de parâmetros */
parameter-list
parameter-list , ...

parameter-list:
parameter-declaration
parameter-list , parameter-declaration

parameter-declaration:
declaration-specifiers declarator
declaration-specifiers abstract-declaratoropt

A parameter-type-list é uma sequência de declarações de parâmetro separadas por vírgulas. O formulário de cada parâmetro em uma lista de parâmetros tem esta aparência:

registeropt type-specifier declaratoropt

Os parâmetros de função declarados com o atributo auto geram erros. Os identificadores dos parâmetros são usados no corpo da função para fazer referência aos valores transmitidos à função. Você pode nomear os parâmetros em um protótipo, mas os nomes saem do escopo no final da declaração. Isso significa que os nomes dos parâmetros podem ser atribuídos da mesma maneira ou de maneira diferente na definição da função. Esses identificadores não podem ser redefinidos no bloco externo do corpo da função, mas podem ser redefinidos em blocos internos e aninhados, como se a lista de parâmetros fosse um bloco delimitador.

Cada identificador em parameter-type-list deve ser precedido pelo especificador de tipo adequado, conforme mostrado neste exemplo:

void new( double x, double y, double z )
{
    /* Function body here */
}

Se pelo menos um parâmetro ocorrer na lista de parâmetros, a lista poderá terminar com uma vírgula seguida de três pontos (, ...). Essa construção, chamada "notação de reticências", indica um número variável de argumentos para a função. (Para obter mais informações, consulte Chamadas com um número variável de argumentos). No entanto, uma chamada para a função deve ter pelo menos o mesmo número de argumentos que os parâmetros antes da última vírgula.

Se nenhum argumento for transmitido à função, a lista de parâmetros será substituída pela palavra-chave void. Esse uso de void é diferente do seu uso como um especificador de tipo.

A ordem e o tipo de parâmetros, inclusive qualquer uso da notação de reticências, devem ser iguais em todas as declarações de função (se houver) e na definição da função. Os tipos de argumentos depois das conversões aritméticas comuns devem ter atribuições compatíveis com os tipos dos parâmetros correspondentes. (Consulte Conversões aritméticas normais para obter informações sobre conversões aritméticas). Os argumentos após as reticências não são verificados. Um parâmetro pode ter qualquer tipo fundamental, de estrutura, união, ponteiro ou matriz.

O compilador executa as conversões aritméticas comuns independentemente em cada parâmetro e em cada argumento, se necessário. Após a conversão, nenhum parâmetro é menor que int e nenhum parâmetro tem o tipo float, a menos que o tipo de parâmetro seja especificado explicitamente como float no protótipo. Isso significa, por exemplo, que declarar um parâmetro como char tem o mesmo efeito que declará-lo como int.

Confira também

Definições de função C