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 esses dois tempos de vida de "estáticos" e "automáticos". Um item com um tempo de vida global existe e tem um valor durante a execução do programa. Todas as funções têm tempos de vida globais.
Variáveis automáticas ou variáveis com tempo de vida local são alocadas ao novo armazenamento sempre que o controle de execução passa para o bloco no qual elas estã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
:
auto
register
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 typedef
Declarações. 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. Declarações fora de todas as definições de função supostamente aparecem no "nível externo". As declarações dentro das 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.