Definições de função C
Uma definição de função especifica o nome da função, os tipos e o número de parâmetros que espera receber, além de seu tipo de retorno. Uma definição de função também inclui um corpo de função com as declarações de suas variáveis locais, e as instruções que determinam o que a função faz.
Sintaxe
translation-unit
:
external-declaration
translation-unit
external-declaration
external-declaration
: /* permitida apenas no escopo externo (do arquivo) */
function-definition
declaration
function-definition
:
declaration-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
é específico da Microsoft */
Os parâmetros de protótipo são:
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
declaration-list
:
declaration
declaration-list
declaration
declarator
:
pointer
opt direct-declarator
direct-declarator
: /* Um declarador de função */
direct-declarator
(
parameter-type-list
)
/* Novo declarador de estilo */
direct-declarator
(
identifier-list
opt )
/* Declarador de estilo obsoleto */
A lista de parâmetros em uma definição usa esta sintaxe:
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-declarator
opt
A lista de parâmetros em uma definição de função antiga usa esta sintaxe:
identifier-list
: /* Usada em declarações e definições de função de estilo obsoleto */
identifier
identifier-list
,
identifier
A sintaxe para o corpo da função é:
compound-statement
:
{
declaration-list
opt statement-list
opt }
Os únicos especificadores de classe de armazenamento que podem alterar uma declaração de função são extern
e static
. O especificador extern
significa que a função pode ser referenciada de outros arquivos; ou seja, o nome da função é exportado para o vinculador. O especificador static
significa que a função não pode ser referenciada por outros arquivos, ou seja, o nome não é exportado pelo vinculador. Se nenhuma classe de armazenamento dor exibida em uma definição de função, extern
será assumido. Em qualquer caso, a função sempre é visível do ponto de definição ao final do arquivo.
Os declaration-specifiers
opcionais e o declarator
obrigatório em conjunto especificam o tipo de retorno e o nome da função. declarator
é uma combinação de identificador que nomeia a função e os parênteses depois do nome da função. O attribute-seq
não terminal opcional é um recurso específico da Microsoft definido em Atributos de função.
O direct-declarator
(na sintaxe declarator
) especifica o nome da função sendo definida e os identificadores dos seus parâmetros. Se o direct-declarator
incluir uma parameter-type-list
, a lista especifica os tipos de todos os parâmetros. Esse declarador também serve como um protótipo da função para chamadas posteriores para a função.
Uma declaration
na declaration-list
em definições de função não pode conter um storage-class-specifier
diferente de register
. O type-specifier
na sintaxe declaration-specifiers
pode ser omitido apenas se a classe de armazenamento register
for especificada para um valor do tipo int
.
A compound-statement
é o corpo da função que contém declarações de variável local, referências a itens declarados externamente e instruções.
As seções Atributos de função, Classe de armazenamento, Tipo de retorno, Parâmetros e Corpo da função descrevem os componentes da definição de função detalhadamente.