Classes de armazenamento C
A "classe de armazenamento" de uma variável determina se o item tem um tempo de vida “global” ou “local”. C chama esse dois tempos de vida de “estático” e “automático”. Um item com um tempo de vida global existe e tem um valor durante toda a execução do programa. Todas as funções têm tempos de vida globais.
As variáveis automáticas, ou variáveis com tempo de vida local, recebem novos armazenamentos cada vez que o controle de execução é transmitido para o bloco no qual elas são definidas. Quando a execução retornar, as variáveis não terão mais valores significativos.
C fornece os seguintes especificadores de classe de armazenamento:
Sintaxe
storage-class-specifier:
autoregister
static
extern
typedef
__declspec ( extended-decl-modifier-seq ) /* Específico da Microsoft */
Com exceção de __declspec, você pode usar somente um storage-class-specifier no declaration-specifier em uma declaração. Se nenhuma especificação de classe de armazenamento for feita, as declarações de um bloco criarão objetos automáticos.
Os itens declarados com o especificador auto ou register têm tempos de vida locais. Os itens declarados com o especificador static ou extern têm tempos de vida globais.
Como typedef e __declspec são semanticamente diferentes dos outros quatro terminais storage-class-specifier, eles são discutidos separadamente. Para obter informações específicas sobre typedef, consulte Declarações typedef. Para obter informações específicas sobre __declspec, consulte Atributos de classe de armazenamento estendidos.
O posicionamento de declarações de variável e de função em arquivos de origem também afeta a classe e a visibilidade de armazenamento. As declarações fora de todas as definições de função devem aparecer no "nível externo". As declarações em definições de função aparecem no "nível interno".
O significado exato de cada especificador de classe de armazenamento depende de dois fatores:
Se a declaração aparece no nível externo ou interno
Se o item que está sendo declarado é uma variável ou uma função
Especificadores de classe de armazenamento para declarações de nível externo e Especificadores de classe de armazenamento para declarações de nível interno descrevem os terminais storage-class-specifier em cada tipo de declaração e explicam o comportamento padrão quando o storage-class-specifier é omitido de uma variável. Especificadores de classe de armazenamento com declarações de função discutem os especificadores de classe de armazenamento usados com as funções.