GCC vs G++: Qual a diferença e qual compilador C++ escolher?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: O drama dos dois nomes

\n\n

Se você já tentou compilar um programa em C++ no Linux ou macOS, certamente já se deparou com dois comandos semelhantes: gcc e g++. À primeira vista, a diferença entre eles é mínima — ambos executam o compilador, ambos sabem trabalhar com C e C++. Mas basta errar na escolha, e você recebe uma montanha de erros de linkagem que podem estragar a noite até mesmo de um desenvolvedor experiente.

\n\n

Esta questão é uma das mais populares no Stack Overflow (mais de 200.000 visualizações!). Iniciantes costumam pensar: "Já que o gcc consegue compilar C++, para que serve o g++?" E é um erro. Hoje vamos entender de uma vez por todas qual é o truque, com exemplos reais de código. Você aprenderá quando usar gcc, quando usar g++ e como não cair na armadilha das dependências implícitas.

\n\n

Breve histórico: o que é GCC?

\n\n

GCC (GNU Compiler Collection) não é um único compilador, mas sim um conjunto completo de ferramentas. Ele inclui compiladores para C, C++, Fortran, Ada e outras linguagens. Historicamente, a sigla significava "GNU C Compiler", mas com o passar dos anos o projeto cresceu.

\n\n

O comando gcc é um driver que, por padrão, executa o compilador para a linguagem C. O comando g++ é o mesmo driver, mas com flags que ativam o suporte a C++. Parece um detalhe. Mas é justamente esse "detalhe" que decide se seu código funcionará ou não.

\n\n

Principal diferença: linkagem das bibliotecas padrão

\n\n

Imagine que você está escrevendo um programa simples em C++:

\n\n
#include <iostream>\nint main() {\n    std::cout << "Olá, mundo!" << std::endl;\n    return 0;\n}\n
\n\n

Vamos tentar compilá-lo de duas maneiras:

\n\n
gcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n
\n\n

Resultado:

\n
    \n
  • g++ — a compilação será bem-sucedida.
  • \n
  • gcc — você receberá um erro de linkagem undefined reference to `std::cout'.
  • \n
\n\n

Por quê? Porque o gcc não vincula automaticamente a biblioteca libstdc++ (a biblioteca padrão do C++). Ele pensa que você está compilando C puro, e em C não existem iostream, std::string e outras vantagens do C++. O g++ faz isso automaticamente.

\n\n

Claro, você pode forçar o gcc a trabalhar com C++ manualmente, adicionando a flag -lstdc++:

\n\n
gcc main.cpp -lstdc++ -o program_gcc_fixed\n
\n\n

Mas para que reinventar a roda? O g++ faz isso "de fábrica".

\n\n

E quanto à compilação de C puro?

\n\n

Aqui tudo é simétrico. Se você escrever um programa em C e tentar compilá-lo com g++, provavelmente funcionará. Mas o g++ interpretará o código como C++, o que significa:

\n
    \n
  • Verificações de tipo mais rigorosas.
  • \n
  • Regras diferentes para conversão implícita de tipos.
  • \n
  • Possíveis avisos (warnings) falsos.
  • \n
\n\n

Exemplo. Código em C:

\n\n
#include <stdio.h>\nint main() {\n    char *s = malloc(100);\n    printf("Hello\\n");\n    free(s);\n    return 0;\n}\n
\n\n

Em C, isso é normal. Em C++, é necessária uma conversão explícita (char*)malloc(100). O g++ emitirá um erro, enquanto o gcc não. Conclusão: para projetos em C, use gcc; para C++, use g++.

\n\n

Extensões de arquivo: como o compilador identifica a linguagem?

\n\n

Outro detalhe importante: gcc e g++ observam a extensão do arquivo.

\n\n
    \n
  • .c — compilado como C.
  • \n
  • .cpp, .cc, .cxx — compilado como C++.
  • \n
\n\n

Se você der ao gcc um arquivo com extensão .cpp, ele entenderá que é C++ e usará o frontend correto (compilador da linguagem). Mas a linkagem ainda será feita sem a

Blogs

Book Recommendations