Compilação de Programas Escritos em C++

Depois de escrever o código fonte de um programa em C++ é necessário gerar um arquivo executável com as instruções do código fonte. Para isso precisamos de um programa que chamamos de compilador. Existem vários compiladores de C++. Neste texto, vamos supor que você está usando o compilador C++ da GNU, chamado de g++.

O compilador pode ser executado por um terminal (interface de linha de comando) ou pelo ambiente de desenvolvimento (interface gráfica) mas de qualquer forma os elementos mostrados aqui valem desde que você esteja usando o g++.

A forma mais simples de executar o compilador para compilar um arquivo C++ é:

g++ arquivo.cpp

Entretanto, desta forma o compilador vai reclamar de pouca coisa no seu código. Reclamar significa avisar que apesar dele conseguir produzir o programa executável existem trechos em que será necessário adivinhar o que você queria que fosse feito, ou talvez supor que você sabe o que faz e por isso alguns trechos estranhos devem ser compilados da forma como você escreveu.

Obviamente, esse comportamento não é muito útil para um programador que está aprendendo ainda. Para quem está aprendendo é importante que o compilador reclame de tudo, criando uma oportunidade do programador rever o código, prestando atenção em detalhes que não foram percebidos anteriormente.

Usando a opção -Wall ao executar o compilador g++, estamos pedindo que o compilador "reclame de tudo". O w maiúsculo vem de warning e all significa "tudo", ou seja, é um mnemônico para "avise tudo" ou "reclame de tudo", conforme estamos dizendo aqui. Assim, o comando de compilação fica:

g++ -Wall arquivo.cpp

São várias as situações de um código sintaticamente correto, mas suspeito, ou perigoso, que provavelmente não é o que o programa queria fazer. Vou dar apenas alguns exemplos:

float n; cout << n << endl;

No exemplo acima, porque alguém iria querer escrever o valor de algo que nunca ganhou um valor? Provavelmente o programador esqueceu de dar valor à variável n. Generalizando, esse é um problema de variável não inicializada. O programa compila e executa mas seus resultados são indeterminados, ou seja, às vezes o programa escreve um valor, às vezes escreve outro. Compilar esse programa usando o primeiro comando mostrado acima não gera nenhuma mensagem. Compilar esse programa usando o segundo comando mostrado acima, gera uma mensagem avisando que a variável n foi usada sem ser inicializada, e isso é importante para quem está aprendendo a programar.

Outros exemplos de problemas que podem ser detectados pedindo a opção -Wall são comparação entre inteiros com e sem sinal, uso de atribuição no lugar da verificação de equivalência e funções onde existe um caminho de execução que não retorna valor. A opção -Wall é geralmente usada de forma automática pelos ambientes de desenvolvimento, mas é sempre bom conferir se o seu está usando essa opção.

Mesmo com a opção -Wall ainda existem diversos problemas não verificados pelo compilador. Eu recomendo o uso da opção -Wconversion que faz o compilador reclamar de conversões implícitas de tipo nas quais é prevista perda de informação. Assim, o comando para compilar fica:

g++ -Wall -Wconversion arquivo.cpp

O código abaixo tem uma atribuição de valor do tipo float para variável do tipo int (pode ser feito, porém com perda de informação) e isso pode ser detectado pela opção -Wconversion.

float b = 2; float c = 3; int q = c/b;

A opção -Wconversion não é usada normalmente pelos ambientes de desenvolvimento. Eu sugiro que você configure seu ambiente de desenvolvimento para usá-la ou, ainda melhor, que faça a compilação pela linha de comando para aprender mais sobre conceitos como arquivos e diretórios, interface de linha de comando, etc.

Esta página é mantida por Bruno Schneider para a disciplina de IAlg