Modificadores de Armazenamento na Linguagem C

funções X macros compilação condicional Diagnóstico

Olá, caro leitor! Palavras chave como static, extern e register fazem parte da linguagem C e são categorizadas como modificadores de armazenamento. De fato, sempre que um programa é compilado espaços de memória são reservados para as variáveis declaradas. Diante disso, esse artigo tem como objetivo apresentar a definição e aplicações dos modificadores de armazenamento da linguagem C.

Os Modificadores de Armazenamento da Linguagem C

Os modificadores de armazenamento indicam para o compilador de que forma essas variáveis no programa devem ser armazenadas. A linguagem C define 4 modificadores de armazenamento: auto, extern, static e register.

  • auto – De modo geral, esse especificador define uma variável como local. No entanto isso é raramente utilizado, pois as variáveis já são definidas como locais por padrão.
  • extern – Tal especificador define que uma variável foi declarada em outro arquivo de código.
  • static – Esse modificador pode ser utilizado para variáveis globais e locais, e tem como função indicar que tal variável é permanente.
  • register – Indica para o compilador que o acesso à variável deve ser o mais rápido possível.

De modo geral, o especificador de armazenamento precede a declaração da variável:

 Modificador_de_armazenamento + Modificador_de_tipo + Nome_da_Variável;

Variáveis estáticas

Para entender a aplicação do modificador static é necessário conhecer as diferenças entre escopo local e global de variáveis. Variáveis locais são definidas dentro de funções e passam a existir somente no momento de execução das funções. Em contraste com as variáveis locais, as de escopo global existem durante todo tempo de execução do programa.

Dessa maneira, ao aplicar o modificador static em uma variável local, o compilador definirá tal variável como permanente. Logo, o valor de uma variável local estática é mantido entre chamadas de uma função. No entanto, isso não significa que a variável pode ser acessada de fora da função, pois o escopo é mantido!

No exemplo mostrado acima, a variável temporária i_tmp terá seu valor igual a zero sempre que a função for chamada. Já a variável estática é inicializada com valor zero durante a inicialização do programa e seu conteúdo é mantido entre as chamadas.

Agora, quando o escopo é global o efeito desse modificador é um pouco diferente. É importante lembrar que variáveis globais são reconhecidas em todo programa, logo a função desse modificador é informar para o compilador que tal variável deve ser reconhecida somente no arquivo em que foi declarada.

Isso é ilustrado na Figura 1, em que duas variáveis com o mesmo nome são utilizadas em módulos diferentes. As duas variáveis são globais, contudo são restritas ao escopo do arquivo fonte.

Variáveis globais restritas ao escopo do módulo.
Figura 1: Variáveis globais restritas ao escopo do módulo.

Gerenciando variáveis de escopo global

Ao criar programas com diversos módulos a definição de variáveis globais pode gerar alguns efeitos indesejáveis. Lembrando que as variáveis globais são visíveis para todo o programa, a definição dessas com nomes iguais geram erros de compilação. Dessa maneira, o especificador extern indica ao compilador que determinada variável já foi definida em outra parte do programa. Isso faz com que o compilador não crie espaço de armazenamento para variável, evitando os conflitos no momento de compilação.

Por exemplo, considere que um arquivo Mod1.c contém a definição de uma flag. 

Já em outro arquivo Mod2.c outra variável de mesmo nome é declarada.

Se as duas variáveis devem existir o operador static pode ser utilizado para restringir seu escopo. No entanto, se apenas umas das flags é necessária e ambos os módulos devem ter acesso, o modificador extern pode ser utilizado. Nesse caso, um dos módulos indica que existe uma variável declarada externamente.

Isso é mostrado na Figura 2.

Variáveis globais utilizadas em módulos diferentes.
Figura 2: Variáveis globais utilizadas em módulos diferentes.

Otimizando o acesso a variáveis

Considere o trecho de programa mostrado abaixo. Neste exemplo, a variável local index é utilizada em todas as iterações do laço FOR. Dessa maneira, a cada iteração são realizadas operações de leitura e armazenamento em seu valor na memória. Assim, um modo de otimizar tais operações pode ser realizado com o uso de registradores.

Originalmente, o uso do modificador register representava o armazenamento de valores dos tipos int e char em registradores da CPU. Dessa maneira, o acesso ao conteúdo dessas variáveis torna-se mais rápido. O trecho de código abaixo indica a modificação necessária.

Cabe ressaltar que isso somente indica para o compilador que o acesso deve ser realizado de forma rápida, ficando a critério do compilador realizar essa alteração. Isso ocorre devido às características do target para qual o código está sendo compilado, pois cada tipo de arquitetura tem um determinado conjunto de registradores disponíveis. Além disso, devido ao armazenamento em um registrador essas variáveis não pode ser acessadas de forma indireta e não podem ser atribuídos para variáveis globais.

Conclusão

Este artigo apresentou os conceitos de modificadores de armazenamento na linguagem C. Esses modificadores podem ser utilizados para determinar de que modo uma variável é armazenada e o escopo a qual pertence. Isso não fica restrito somente na definição de variáveis, podendo ser aplicado em funções!

Referências

Veja + conteúdo

Fascinado por computação, especialmente na interface entre hardware e software, me engajei na área de sistemas embarcados. Atuo com desenvolvimento de sistemas embarcados e sou docente da Faculdade de Engenharia de Sorocaba.

Para mais informações: https://about.me/fdelunogarcia

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Richard
Richard
31/12/2019 01:59

Muito bom.

Talvez você goste:

Séries

Menu