Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
7.3 - Protótipos de Funções<br />
Até agora, nos exemplos apresenta<strong>do</strong>s, escrevemos as funções antes de escrevermos a função main(). Isto é, as<br />
funções estão fisicamente antes <strong>da</strong> função main(). Isto foi feito por uma razão. Imagine-se na pele <strong>do</strong> compila<strong>do</strong>r. Se<br />
você fosse compilar a função main(), onde são chama<strong>da</strong>s as funções, você teria que saber com antecedência quais são<br />
os tipos de retorno e quais são os parâmetros <strong>da</strong>s funções para que você pudesse gerar o código corretamente. Foi por<br />
isto as funções foram coloca<strong>da</strong>s antes <strong>da</strong> função main(): quan<strong>do</strong> o compila<strong>do</strong>r chegasse à função main() ele já teria<br />
compila<strong>do</strong> as funções e já saberia seus formatos.<br />
Mas, muitas vezes, não poderemos nos <strong>da</strong>r ao luxo de escrever nesta ordem. Muitas vezes teremos o nosso programa<br />
espalha<strong>do</strong> por vários arquivos. Ou seja, estaremos chaman<strong>do</strong> funções em um arquivo que serão compila<strong>da</strong>s em outro<br />
arquivo. Como manter a coerência?<br />
A solução são os protótipos de funções. Protótipos são na<strong>da</strong> mais, na<strong>da</strong> menos, que declarações de funções. Isto é,<br />
você declara uma função que irá usar. O compila<strong>do</strong>r toma então conhecimento <strong>do</strong> formato <strong>da</strong>quela função antes de<br />
compilá -la. O código correto será então gera<strong>do</strong>. Um protótipo tem o seguinte formato:<br />
tipo_de_retorno nome_<strong>da</strong>_função (declaração_de_parâmetros);<br />
onde o tipo-de-retorno, o nome-<strong>da</strong>-função e a declaração-de-parâmetros são os mesmos que você pretende usar<br />
quan<strong>do</strong> realmente escrever a função. Repare que os protótipos têm uma níti<strong>da</strong> semelhança com as declarações de<br />
variáveis. Vamos implementar agora um <strong>do</strong>s exemplos <strong>da</strong> seção anterior com algumas alterações e com protótipos:<br />
#include <br />
float Square (float a);<br />
main ()<br />
{<br />
float num;<br />
printf ("Entre com um numero: ");<br />
scanf ("%f",&num);<br />
num=Square(num);<br />
printf ("\n\nO seu quadra<strong>do</strong> vale: %f\n",num);<br />
}<br />
float Square (float a)<br />
{<br />
return (a*a);<br />
}<br />
Observe que a função Square() está coloca<strong>da</strong> depois de main(), mas o seu protótipo está antes. Sem isto este<br />
programa não funcionaria corretamente.<br />
Usan<strong>do</strong> protótipos você pode construir funções que retornam quaisquer tipos de variáveis. É bom ressaltar que<br />
funções podem também retornar ponteiros sem qualquer problema. Eles não só aju<strong>da</strong>m o compila<strong>do</strong>r. Eles aju<strong>da</strong>m a<br />
você também. Usan<strong>do</strong> protótipos o compila<strong>do</strong>r evita erros, não deixan<strong>do</strong> que o programa<strong>do</strong>r use funções com os<br />
parâmetros erra<strong>do</strong>s e com o tipo de retorno erra<strong>do</strong>, o que é uma grande aju<strong>da</strong>.<br />
7.4 - O Tipo void<br />
Agora vamos ver o único tipo <strong>da</strong> linguagem C que não vimos ain<strong>da</strong>: o void. Em inglês, void quer dizer vazio e é isto<br />
mesmo que o void é. Ele nos permite fazer funções que não retornam na<strong>da</strong> e funções que não têm parâmetros!<br />
Podemos agora escrever o protótipo de uma função que não retorna na<strong>da</strong>:<br />
void nome_<strong>da</strong>_função (declaração_de_parâmetros);<br />
Numa função, como a acima, não temos valor de retorno na declaração return. Aliás, neste caso, o coman<strong>do</strong> return<br />
não é necessário na função.<br />
Podemos, também, fazer funções que não têm parâmetros:<br />
tipo_de_retorno nome_<strong>da</strong>_função (void);<br />
ou, ain<strong>da</strong>, que não tem parâmetros e não retornam na<strong>da</strong>:<br />
void nome_<strong>da</strong>_função (void);<br />
Um exemplo de funções que usam o tipo void:<br />
#include <br />
void Mensagem (void);<br />
main ()<br />
{<br />
Mensagem();<br />
printf ("\tDiga de novo:\n");<br />
Pág. 49