Bibliotecas estáticas c/c++

Este é um tópico muito batido, tão velho quanto a linguagem C, mas que muita gente procura. Já que existem milhares de livros de c/c++ parecidos que podem fazer diferença para cada leitor, resolvi escrevi este artigo. Em resumo será mostrado como fazer um programa em c++ com funções e como fazê-lo da mesma forma com uma biblioteca.

[ Hits: 39.283 ]

Por: Fábio A. B. em 03/06/2007


Funções



Em primeiro lugar gostaria de deixar claro que estamos usando uma função (uma das formas de se usar funções) para exemplificar o uso de bibliotecas estáticas em c/cpp, mas poderíamos usar outras potencialidades desta linguagem (como o uso de classes, procedures, etc).

Uma função é parte de um programa, que faz sempre uma determinada tarefa, e que pode ser chamada a qualquer momento para executar esta tarefa.

Como exemplo abaixo se tem um programa com uma função que será chamada duas vezes. A tarefa desta função é somar dois números.

Na pasta home de seu Linux abra uma pasta chamada "programas". Dentro desta pasta, abra um arquivo texto, copie e cole este arquivo e salve o nome programa_com_function.cpp (pode ser outro nome, claro).

// Exemplo de programa com função

#include <iostream.h>  //esta declaração vale pro programa todo.

int soma (int a, int b)  //protótipo da função ("tem seu nome, e suas
                         //variáveis "a" e "b" do tipo inteiro)
{
  int r;  // r é uma variável  que tem do tipo inteiro
  r=a+b;  // "r" recebe a soma de dois números  "a" e "b"
          // que serão fornecidos pelo programa principal.     
  return (r);  // retorna ao programa principal o valor da variável "r"

} //acabou a função

// Aqui iniciamos o programa principal. Ele é que chama as funções
//quantas vezes pedirmos pra ele fazer isso

int main ()
{
int soma1;
int soma2;
int a;
int b;
cout << "\ndigite o primeiro valor\t";
cin >> a;
cout << "\ndigite o segundo valor\t";
cin >> b;
soma1 = soma (a,b);   //chamou a função "soma" acima e a atribuiu à
                      // suas entradas os valores "a" e "b" digitados na tela e
                      // soma1 recebe o valor de "r"
cout << "\nO resultado da soma1 vale\t" << soma1;

cout << "\n\n\ndigite o primeiro valor\t";
cin >> a;
cout << "\ndigite o segundo valor\t";
cin >> b;
soma2 = soma (a,b);  //chamou a função "soma" de novo  e a atribuiu à
                     //suas entradas os valores "a" e "b" digitados na tela e
                     // soma2 recebe o valor de "r"
cout << "\nO resultado da soma2 vale\t" << soma2;
} // fim do programa

Considero que você já tenha o gcc instalado no Linux claro.

Entre no bash (linha de comando) e vá até a pasta onde está este arquivo texto (/home/programas) que você acabou de copiar, colar e salvar como "programa_com_função.cpp". Agora digite:

$ g++ programa_com_função.cpp -o meu_programa

Onde "-o meu_programa" avisa para que o programa executável de saída tenha o nome "meu_programa.exe".

Então digite:

$ ./meu_programa.exe

Agora digite os valores inteiros pedidos e vá dando enter. Você verá o resultado das somas dos números. Lembre-se que você chamou duas vezes a função soma no programa acima.

Esta é uma das várias formas de se fazer um programa com função!

    Próxima página

Páginas do artigo
   1. Funções
   2. Gerando bibliotecas estáticas
   3. Retomando o programa principal
   4. Gerando o executável
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Liberando Memória ajustando o Tamanho das Strings em C

Criando uma calculadora com o KDevelop

Vírus de computador e criação de um vírus em C/C++ (parte 1 - básico)

Mais sobre recursividade em C/C++

Introdução à linguagem C - Parte II

  
Comentários
[1] Comentário enviado por linuxalexsandro em 03/06/2007 - 11:30h

Gostei muito do artigo. Ele é bastante útil para estudantes iniciantes das linguagens c/cpp que desejam conhecer mais sobre o compilador gcc. Parabéns FAB

[2] Comentário enviado por sombriks em 03/06/2007 - 17:00h

Olá,

sombriks@comander:~/variados$ g++ -Wall pograma.cc -o pograma
In file included from /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../../include/c++/4.1.2/backward/iostream.h:31,
from pograma.cc:3:
/usr/lib/gcc/i486-slackware-linux/4.1.2/../../../../include/c++/4.1.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
sombriks@comander:~/variados$

todavia a execução é perfeita. Aparentemente no C++ o .h no final do arquivo foi depreciado.

Em C/C++ não basta apenas saber a linguagem; tem-se que aprender também os pormenores do compilador! Como estou estudando isso há umas 48 horas (direto, hahahaha) não resisti e decidi comentar.

Um Livro (pdf, mas deve existir como papel tb!) que eu recomendo se vc quiser uma rápida referência de C/C++ e um excelente tutorial de gcc é o do Brian Gough; dêem uma boa gloogada.

[3] Comentário enviado por V_Style em 03/06/2007 - 18:25h

Ola sombriks,

Então, o que significa efetivamente esse lance do se colocar o .h ou nao se colocar o .h no header?
Valeu
FAB

[4] Comentário enviado por feraf em 03/06/2007 - 19:48h

Para tornar o código portável, deve-se utilizar o iostream sem o .h. Isso se deve ao fato de que a iostream é uma namespace, ou seja, um aglomerado de classes. Na hora de invocar os métodos da iostream, deve-se chamá-los com std::cin e std::cout para entrada e saída padrão respectivamente. Opcionalmente pode-se importar o namespace std com 'using namespace std' e depois usar cin e cout diretamente.

[5] Comentário enviado por osirix em 25/02/2009 - 18:41h

Otimoooooooooooooo!!!
muito bom seu artigo ..
muito facil de entender .. !!
poxa dou nota 10000000000000000 pra ele .. ^^

vlw


[6] Comentário enviado por staltux em 23/04/2009 - 01:54h

cara legal...mas eu tenho uma pergunta...eu fiz isso que você mostrou e funcionou...
depois eu fiz novamente mas no code::blocks...sabe, criei um projeto e coloquei os arquivos nele...entao eu mandei compilar e executar e funcionou perfeitamente tambem...agora eu te pergunto:

Como o Code::Blocks sabe que o arquivo soma_function.cpp é a implementação do soma_header.h se em nenhum desses arquivos existe algo os relacionando...e eu tambem nao fiz nenhuma modificação nos scriptis de compilação do code...
é magica? magia negra? como ele adivinha isso?

[7] Comentário enviado por sombriks em 23/04/2009 - 09:18h

@alexfernandognr, essa é fácil.

ao compilar cada um dos N fontes individualmente o compilador vai apenas averiguar se todos os protótipos de função existem (i.e. não vai atrás da implementação ainda)

"g++ -c" não faz o executável, apenas o que é chamado de "código objeto".

No exemplo dado se vc der "g++ -c soma_function.cpp ; g++ -c g++ -c soma_principal.cpp" ambos vão gerar seus respectivos ".o" sem maiores dificuldades. Você somente teria problemas se os protótipos de função (declarados neste caso como manda a boa prática, no header) fossem usados de forma errada, o que implica em erro de compilação.

A mágica aqui é a etapa de linkagem ou linkedição.

"g++ soma_function.o soma_principal.o -o soma" faz a linkagem, é aqui o truque: o linker não precisa mais conhecer o código, apenas assegurar que cada chamada tem uma implementação em algum lugar no meio de todos os códigos objeto. dessa forma o problema é quebrado em pedaços menores e fica mais simples de resolver, ;)

em resumo, lembre-se que há duas etapas bem distintas: compilação e linkedição. A primeira cuida de achar os protótipos, mas é na segunda que juntamos as implementações.

[8] Comentário enviado por staltux em 23/04/2009 - 16:20h

entendido...
existe algum paramentro que possa ser colocado dentro do arquivo que implementa, para especificar de qual header se trata?
pois acho que teria problema se mais de um arquivo cpp implementa-se a mesma função...
tipo dois cpps implementando a mesma função com apenas um header...

[9] Comentário enviado por sombriks em 23/04/2009 - 19:55h

tem não, mas se você tiver no meio do seu mar de arquivos fontes dois que implementem o mesmo protótipo o linker irá falhar ao tentar juntar essas duas.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts