
Estes modificadores de tipo atuam sobre a maneira com a qual o compilador vai armazenar a variável.
int count;
float sum;
main (void)
{
...
return 0;
}
Num outro módulo do programa temos uma rotina que deve usar as variáveis
globais acima. Digamos que a rotina que queremos se chama RetornaCount()
e retorna o valor atual de count. O problema é que este módulo
será compilado em separado e não tomará conhecimento
dos outros módulos. O que fazer? Será que funcionaria se
fizermos assim:
int count; /* errado */
float sum;
int RetornaCount (void)
{
return count;
}
Não. O módulo compilaria sem problema, mas, na hora que fizermos
a linkagem (união dos módulos já compilados para gerar
o executável) vamos nos deparar com uma mensagem de erro dizendo
que as variáveis globais count e sum foram declaradas mais de uma
vez. A maneira correta de se escrever o módulo com a função
RetornaCount() é:
extern int count; /* certo */
extern float sum;
int RetornaCount (void)
{
return count;
}
Assim, o compilador irá saber que count e sum estão
sendo usados no bloco mas que foram declarados em outro.
Variáveis globais static funcionam como variáveis globais dentro de um módulo, ou seja, são variáveis globais que não são (e nem podem ser) conhecidas em outros modulos. Isto é util se quisermos isolar pedaços de um programa para evitar mudanças acidentais em variáveis globais.
Variáveis locais static são variáveis cujo valor é mantido de uma chamada da função para a outra. Veja o exemplo:
int count (void)
{
static int num=0;
num++;
return num;
}
A função count() retorna o número de vezes
que ela já foi chamada. Veja que a variável local int
é inicializada. Esta inicialização só vale
para a primeira vez que a função é chamada
pois num deve manter o seu valor de uma chamada para a outra. O
que a função faz é incrementar num a cada chamada
e retornar o seu valor. A melhor maneira de se entender esta variável
local static é implementando. Veja por si mesmo, executando
seu próprio programa que use este conceito.
Vamos agora ressaltar vários pontos importantes. Em primeiro lugar, porque usar o register? Variáveis nos registradores da CPU vão ser acessadas em um tempo muito menor pois os registradores são muito mais rápidos que a memória. Em segundo lugar, em que tipo de variável usar o register? O register não pode ser usado em variáveis globais. Isto implicaria que um registrador da CPU ficaria o tempo todo ocupado por conta de uma variável. Os tipos de dados onde é mais aconselhado o uso do register são os tipos char e int, mas pode-se usá-lo em qualquer tipo de dado. Em terceiro lugar, o register é um pedido que o programador faz ao compilador. Este não precisa ser atendido necessariamente.
Um exemplo do uso do register é dado:
main (void)
{
register int count;
for (count=0;count<10;count++)
{
...
}
return 0;
}
O loop for acima será executado mais rapidamente do que seria
se não usássemos o register. Este é o uso mais
recomendável para o register: uma variável que será
usada muitas vezes em seguida.
Perguntas para a lista do Curso de C