C Fundamentos Intermediário
Escopo e classes de armazenamento
Em C, o escopo determina onde uma variável pode ser acessada, enquanto a classe de armazenamento define seu tempo de vida (quando ela é criada e destruída) e sua visibilidade. As principais palavras-chave são auto, static, extern e register.
Variáveis locais comuns têm escopo de bloco e tempo de vida automático: nascem ao entrar no bloco e morrem ao sair. Já variáveis static locais mantêm o valor entre chamadas de função, pois são alocadas na memória estática. Variáveis globais têm escopo de arquivo e tempo de vida estático, e podem ser acessadas por outros arquivos com extern.
A palavra-chave register sugere ao compilador que a variável seja armazenada em registrador da CPU, mas isso é apenas uma dica — o compilador pode ignorá-la. Entender essas classes evita bugs como usar variável não inicializada, perder valor entre chamadas ou ter conflitos de nomes.
Pontos-chave
autoé o padrão para variáveis locais: escopo de bloco e tempo de vida automático.staticlocal preserva o valor entre chamadas, mas só é visível dentro do bloco.staticglobal restringe a visibilidade ao arquivo atual (linkagem interna).externdeclara uma variável definida em outro arquivo ou mais adiante no mesmo arquivo.registersugere armazenamento em registrador; não é possível obter seu endereço com&.
#include <stdio.h>
int contador_global = 0; // variável global, tempo de vida estático
void incrementa(void) {
static int chamadas = 0; // static local: mantém valor entre chamadas
chamadas++;
contador_global++;
printf("Chamadas: %d, global: %d\n", chamadas, contador_global);
}
int main(void) {
auto int local = 10; // auto é opcional, mas explícito aqui
register int rapido = 5; // sugere registrador
printf("local: %d, rapido: %d\n", local, rapido);
incrementa();
incrementa();
incrementa();
{
int local = 99; // novo escopo, sombreia o anterior
printf("local interno: %d\n", local);
}
printf("local externo: %d\n", local);
return 0;
}