C - Classes de armazenamento
Uma classe de armazenamento define o escopo (visibilidade) e o tempo de vida de variáveis e / ou funções dentro de um Programa C. Eles precedem o tipo que eles modificam. Temos quatro classes de armazenamento diferentes em um programa C -
- auto
- register
- static
- extern
A classe de armazenamento auto
o auto classe de armazenamento é a classe de armazenamento padrão para todas as variáveis locais.
{
int mount;
auto int month;
}
O exemplo acima define duas variáveis na mesma classe de armazenamento. 'auto' só pode ser usado em funções, ou seja, variáveis locais.
A classe de armazenamento registrada
o registerA classe de armazenamento é usada para definir variáveis locais que devem ser armazenadas em um registro em vez de na RAM. Isso significa que a variável tem um tamanho máximo igual ao tamanho do registro (geralmente uma palavra) e não pode ter o operador unário '&' aplicado a ela (pois não tem uma localização na memória).
{
register int miles;
}
O registro deve ser usado apenas para variáveis que requerem acesso rápido, como contadores. Deve-se notar também que definir 'registro' não significa que a variável será armazenada em um registro. Isso significa que PODE ser armazenado em um registro dependendo do hardware e das restrições de implementação.
A classe de armazenamento estática
o staticA classe de armazenamento instrui o compilador a manter uma variável local existente durante o tempo de vida do programa, em vez de criá-la e destruí-la toda vez que ela entrar e sair do escopo. Portanto, tornar as variáveis locais estáticas permite que eles mantenham seus valores entre as chamadas de função.
O modificador estático também pode ser aplicado a variáveis globais. Quando isso é feito, o escopo da variável fica restrito ao arquivo no qual ela foi declarada.
Na programação C, quando static é usado em uma variável global, ele faz com que apenas uma cópia desse membro seja compartilhada por todos os objetos de sua classe.
#include <stdio.h>
/* function declaration */
void func(void);
static int count = 5; /* global variable */
main() {
while(count--) {
func();
}
return 0;
}
/* function definition */
void func( void ) {
static int i = 5; /* local static variable */
i++;
printf("i is %d and count is %d\n", i, count);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0
A classe de armazenamento externa
o externA classe de armazenamento é usada para fornecer uma referência de uma variável global que é visível para TODOS os arquivos de programa. Quando você usa 'extern', a variável não pode ser inicializada, no entanto, ele aponta o nome da variável para um local de armazenamento que foi definido anteriormente.
Quando você tem vários arquivos e define uma variável ou função global, que também será usada em outros arquivos, extern será usado em outro arquivo para fornecer a referência da variável ou função definida. Apenas para compreensão, extern é usado para declarar uma variável global ou função em outro arquivo.
O modificador externo é mais comumente usado quando há dois ou mais arquivos compartilhando as mesmas variáveis globais ou funções conforme explicado abaixo.
First File: main.c
#include <stdio.h>
int count ;
extern void write_extern();
main() {
count = 5;
write_extern();
}
Second File: support.c
#include <stdio.h>
extern int count;
void write_extern(void) {
printf("count is %d\n", count);
}
Aqui, extern está sendo usado para declarar a contagem no segundo arquivo, onde como tem sua definição no primeiro arquivo, main.c. Agora, compile esses dois arquivos da seguinte maneira -
$gcc main.c support.c
Ele irá produzir o programa executável a.out. Quando este programa é executado, ele produz o seguinte resultado -
count is 5