Programar em C/Mais sobre variáveis: diferenças entre revisões
[edição não verificada] | [edição verificada] |
Conteúdo apagado Conteúdo adicionado
Rejeitou a última alteração do texto (de 109.15.255.84) e reverteu para a edição 255635 de Abacaxi |
|||
Linha 186:
}
</source>
== Atributos das variáveis ==
Linha 291 ⟶ 231:
Um uso importante de variáveis <tt>volatile</tt> é em aplicações com várias ''threads'' (linhas de execução), onde a memória é compartilhada por vários pedaços de código que são executados simultaneamente.
=== extern ===
O modificador '''<tt>extern</tt>''' diz ao compilador que a variável indicada foi declarada em outro arquivo que não podemos incluir diretamente, por exemplo o código de uma biblioteca padrão. Isso é importante pois, se não colocarmos o modificador '''extern''', o compilador irá declarar uma nova variável com o nome especificado, "ocultando" a variável que realmente desejamos usar. E se simplesmente não declarássemos a variável, já sabemos que o compilador não saberia o tamanho da variável.
Quando o compilador encontra o modificador '''extern''', ele marca a variável como não resolvida, e o montador se encarregará de substituir o endereço correto da variável.
extern float sum;
extern int count;
float returnSum (void)
{
count++;
return sum;
}
Neste exemplo, o compilador irá saber que <var>count</var> e <var>sum</var> estão sendo usados no arquivo mas que foram declarados em outro.
Uma variável externa frequentemente usada é a variável <var>errno</var> (declarada no arquivo-cabeçalho errno.h), que indica o último código de erro encontrado na execução de uma função da biblioteca padrão ou do sistema.
=== static ===
O funcionamento das variáveis declaradas como '''<tt>static</tt>''' depende de se estas são globais ou locais.
* Variáveis globais <tt>static</tt> 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 módulos (arquivos). Isto é util se quisermos isolar pedaços de um programa para evitar mudanças acidentais em variáveis globais. Isso é um tipo de ''encapsulamento'' — que é, simplificadamente, o ato de não permitir que uma variável seja modificada diretamente, mas apenas por meio de uma função.
* Variáveis locais estáticas 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.
=== register ===
O computador pode guardar dados na memória (RAM) e nos registradores internos do processador. As variáveis (assim como o programa como um todo) costumam ser armazenadas na memória. O modificador <tt>register</tt> diz ao compilador que a variável em questão deve ser, se possível, guardada em um registrador da CPU.
Vamos agora ressaltar vários pontos importantes:
* '''Porque usar <tt>register?</tt>''' 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. No entanto, a maioria dos compiladores otimizantes atuais usa registradores da CPU para variáveis, então o uso de <tt>register</tt> é freqüentemente desnecessário.
* '''Em que tipo de variável podemos usar o <tt>register</tt>?''' Antes da criação do padrão ANSI C, <tt>register</tt> aplicava-se apenas aos tipos <tt>int</tt> e <tt>char</tt>, mas o padrão atual permite o uso de <tt>register</tt> para qualquer um dos quatro tipos fundamentais. É claro que seqüências de caracteres, arrays e estruturas também não podem ser guardadas nos registradores da CPU por serem grandes demais.
* '''<tt>register</tt> é um ''pedido'' que o programador faz ao compilador.''' Este não precisa ser atendido necessariamente, e alguns compiladores até ignoram o modificador ''register'', o que é permitido pelo padrão C.
* '''<tt>register</tt> não pode ser usado em variáveis globais''', pois isto implicaria em um registrador da CPU ficar o tempo todo ocupado por essa variável.
Um exemplo do uso do register é dado a seguir:
int main (void)
{
register int count;
for (count = 0; count < 10; count++)
{
...
}
return 0;
}
O loop acima, em compiladores que não guardam variáveis em registradores por padrão, deve 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.
{{Esboço/Informática}}
|