14.03.2015 Views

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

}<br />

No exemplo, num está protegi<strong>do</strong> contra alterações. Isto quer dizer que, se tentássemos fazer<br />

*num=10;<br />

dentro <strong>da</strong> função sqr() o compila<strong>do</strong>r <strong>da</strong>ria uma mensagem de erro.<br />

10.1.2 - volatile<br />

O modifica<strong>do</strong>r volatile diz ao compila<strong>do</strong>r que a variável em questão pode ser altera<strong>da</strong> sem que este seja avisa<strong>do</strong>. Isto<br />

evita "bugs" seríssimos. Digamos que, por exemplo, tenhamos uma variável que o BIOS <strong>do</strong> computa<strong>do</strong>r altera de<br />

minuto em minuto (um relógio por exemplo). Seria muito bom que declarássemos esta variável como sen<strong>do</strong> volatile.<br />

10.2 - Especifica<strong>do</strong>res de Classe de Armazenamento<br />

Estes modifica<strong>do</strong>res de tipo atuam sobre a maneira com a qual o compila<strong>do</strong>r vai armazenar a variável.<br />

10.2.1 - auto<br />

O especifica<strong>do</strong>r de classe de armazenamento auto define variáveis locais. Raramente usa<strong>do</strong> pois to<strong>da</strong>s as variáveis <strong>do</strong><br />

C são auto por definição.<br />

10.2.2 - extern<br />

O extern define variáveis que serão usa<strong>da</strong>s em um arquivo apesar de terem si<strong>do</strong> declara<strong>da</strong>s em outro. Ao contrário<br />

<strong>do</strong>s programas até aqui vistos, podemos ter programas de vários milhares de linhas. Estes podem ser dividi<strong>do</strong>s em<br />

vários arquivos (módulos) que serão compila<strong>do</strong>s separa<strong>da</strong>mente. Digamos que para um programa grande tenhamos<br />

duas variáveis globais: um inteiro count e um float sum. Estas variáveis são declara<strong>da</strong>s normalmente em um <strong>do</strong>s<br />

módulos <strong>do</strong> programa. Por exemplo:<br />

int count;<br />

float sum;<br />

main (void)<br />

{<br />

...<br />

return 0;<br />

}<br />

Num outro módulo <strong>do</strong> programa temos uma rotina que deve usar as variáveis globais acima. Digamos que a rotina<br />

que queremos se chama RetornaCount() e retorna o valor atual de count. O problema é que este módulo será<br />

compila<strong>do</strong> em separa<strong>do</strong> e não tomará conhecimento <strong>do</strong>s outros módulos. O que fazer? Será que funcionaria se<br />

fizermos assim:<br />

int count; /* erra<strong>do</strong> */<br />

float sum;<br />

int RetornaCount (void)<br />

{<br />

return count;<br />

}<br />

Não. O módulo compilaria sem problema, mas, na hora que fizermos a linkagem (união <strong>do</strong>s módulos já compila<strong>do</strong>s<br />

para gerar o executável) vamos nos deparar com uma mensagem de erro dizen<strong>do</strong> que as variáveis globais count e sum<br />

foram declara<strong>da</strong>s mais de uma vez. A maneira correta de se escrever o módulo com a função RetornaCount() é:<br />

extern int count; /* certo */<br />

extern float sum;<br />

int RetornaCount (void)<br />

{<br />

return count;<br />

}<br />

Assim, o compila<strong>do</strong>r irá saber que count e sum estão sen<strong>do</strong> usa<strong>do</strong>s no bloco mas que foram declara<strong>do</strong>s em outro.<br />

10.2.3 - static<br />

O funcionamento <strong>da</strong>s variáveis declara<strong>da</strong>s como static depende se estas são globais ou locais.<br />

Variáveis globais static funcionam como variá veis globais dentro de um módulo, ou seja, são variáveis globais que<br />

não são (e nem podem ser) conheci<strong>da</strong>s em outros modulos. Isto é util se quisermos isolar pe<strong>da</strong>ços de um programa<br />

para evitar mu<strong>da</strong>nças acidentais em variáveis globais.<br />

Variáveis locais static são variáveis cujo valor é manti<strong>do</strong> de uma chama<strong>da</strong> <strong>da</strong> função para a outra. Veja o exemplo:<br />

Pág. 69

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!