paulo1205
(usa Ubuntu)
Enviado em 07/05/2015 - 11:28h
Thihup escreveu:
Olá galera!
Hoje eu vi que o GCC 4.8 também compila código de C++, mas isso é bom ou ruim? Eu achava que seria algo como compiladores diferentes para linguagens diferentes, mas parece que me enganei.
Os comandos
gcc e
g++ são pontos de entrada diferentes para um motor de compilação que compartilha a grande maioria dos componentes. Aliás, além de compilação propriamente dita, eles podem ser usados para outras operações, tais como preprocessamento,
assembly e
linking.
Essa flexibilidade se consegue, em parte, através da análise dos nomes dos arquivos passados como argumentos. Então, sufixos de nomes de arquivos como ".c" e ".h" são heuristicamente inferidos como sendo código fonte em C; ".C" (maiúsculo), ".cc", ".cpp", ".cxx" e ".c++", como programas em C++; ".s" ou ".asm" como programas em Assembly; ".f", ".for" ou ".f77" como código em Fortran, ".o", ".a", ".obj", ".lib" como código-objeto para o
linker; etc.
A heurística geralmente funciona, mas tem algumas limitações. Por exemplo:
- A distinção entre ".c" para C e ".C" para C++ pode ser difícil de se fazer em algumas plataformas que não forcem a distinção entre minúsculas e maiúsculas nos nomes dos arquivos (como no mundo Microsoft). Esse problema pode se estender também ao mundo UNIX, se forem copiados para uma máquina UNIX arquivos originalmente criados em plataforma DOS, Windows ou OS/2.
- Existem pessoas que usam e/ou advogam o uso do sufixo ".c" (ou ".C") indistintamente para programas em C ou em C++ (menos frequente hoje em dia do que já foi no passado, ainda mais dados os caminhos de evolução divergentes que as duas linguagens vêm tomando).
- Código legado que incorre num dos casos acima.
- A heurística funciona tanto para o comando
gcc quanto para o
g++, mas alguns
defaults são diferentes quando se chama com um nome ou com o outro.
- Como caso particular do aspecto acima, os sufixos usados para inferir entre C e C++ afetam apenas para a etapa de compilação (produção do ".o" ou ".obj" de cada arquivo fonte), mas não a etapa de
linking, necessária para gerar o executável final. Se você fizer a versão em C++ do clássico "Hello, World.", a saber
#include <iostream>
int main(){
std::cout << "Hello, World.\n";
}
, e tentar gerar o executável com
gcc, em vez de
g++, receberá vários erros na etapa de
linking. Eles ocorrem porque o comando
gcc invoca o
linker com opções de bibliotecas para programas em C, mesmo quando o arquivo compilado está noutra linguagem. Se, por outro lado, você tentar gerar o executável com o comando
g++, ele será gerado com sucesso, pois o
linker será invocado com referências à biblioteca padrão do C++.
Então, é bom esse recurso ?
A questão passa por escolha pessoal.
Minha opinião particular é a de que, assim como sufixos distintos nos nomes do arquivo facilitam não apenas a heurística do compilador, mas também a minha própria organização, usar o ponto de entrada adequado a cada peça de código me ajuda a evitar surpresas. Se eu gosto do C e do C++ porque essas linguagens, em larga medida, assumem que o programador sabe o que está fazendo e não tentam interferir demais, então é bom mesmo que eu saiba o que estou fazendo.