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