Estou na faculdade e, para um projeto que estamos usando C. Exploramos o GCC e o Clang, e o Clang parece ser muito mais amigável que o GCC. Como resultado, estou me perguntando quais são as vantagens ou desvantagens de usar o clang, em oposição ao GCC, para desenvolver em C e C ++ no Linux?
No meu caso, isso seria usado para programas em nível de aluno, não para produção.
Se eu usar o Clang, devo depurar com o GDB e usar o GNU Make, ou usar outro depurador e criar utilitário?
<atomic>
não é suportado, talvez algumas outras pequenas coisas estejam faltando ... Eu não posso usá-lo, por isso não estou totalmente atualizado com ele).Respostas:
EDITAR:
O pessoal do gcc realmente melhorou a experiência de diagnóstico no gcc (ah concorrência). Eles criaram uma página wiki para mostrá-la aqui . O gcc 4.8 agora também possui diagnósticos muito bons (suporte a cores adicionado ao gcc 4.9x). Clang ainda está na liderança, mas a diferença está diminuindo.
Original:
Para os alunos, eu recomendaria incondicionalmente o Clang.
O desempenho em termos de código gerado entre o gcc e o Clang agora não está claro (embora eu ache que o gcc 4.7 ainda lidera, ainda não vi benchmarks conclusivos), mas para os alunos aprenderem, isso realmente não importa.
Por outro lado, os diagnósticos extremamente claros de Clang são definitivamente mais fáceis para os iniciantes interpretarem.
Considere este trecho simples:
Você notará imediatamente que o ponto-e-vírgula está ausente após a definição do
Student
classe, certo :)?Bem, o GCC também nota , de certa forma:
E Clang não está exatamente estrelando aqui também, mas ainda assim:
Eu escolhi propositadamente um exemplo que aciona uma mensagem de erro pouco clara (proveniente de uma ambiguidade na gramática), em vez dos exemplos típicos "Oh meu Deus, Clang, leia minha mente". Ainda assim, percebemos que o Clang evita o fluxo de erros. Não há necessidade de assustar os alunos.
fonte
No momento, o GCC tem um suporte muito melhor e mais completo para os recursos do C ++ 11 do que o Clang. Além disso, o gerador de código para o GCC executa uma otimização melhor do que o de Clang (na minha experiência, eu não vi nenhum teste exaustivo).
Por outro lado, o Clang geralmente compila o código mais rapidamente que o GCC e produz melhores mensagens de erro quando há algo errado com o seu código.
A escolha de qual usar realmente depende do que é importante para você. Eu valorizo mais o suporte ao C ++ 11 e a qualidade de geração de código do que a conveniência da compilação. Por causa disso, eu uso o GCC. Para você, os trade-offs podem ser diferentes.
fonte
Eu uso os dois porque às vezes eles dão mensagens de erro diferentes e úteis.
O projeto Python conseguiu encontrar e corrigir vários pequenos bugs quando um dos principais desenvolvedores tentou compilar com o clang.
fonte
Eu uso o Clang e o GCC, acho que o Clang tem alguns avisos úteis, mas para meus próprios benchmarks de rastreamento de raios - é consistentemente 5-15% mais lento que o GCC (leve isso com grão de sal, é claro, mas tentei usar sinalizadores de otimização semelhantes) para ambos).
Então, por enquanto, uso a análise estática de Clang e seus avisos com macros complexas: (embora agora os avisos do GCC sejam igualmente bons - gcc4.8 - 4.9).
Algumas considerações:
Clangs QtCreator, por exemplo,*****). EDIT: QtCreator agora suporta a saída de Clang***** - essas áreas estão em desenvolvimento ativo e em breve poderão ser apoiadas
fonte
Para programas em nível de aluno, o Clang tem o benefício de, por padrão, ser mais rígido. o padrão C. Por exemplo, a seguinte versão K&R do Hello World é aceita sem aviso prévio pelo GCC, mas rejeitada pelo Clang com algumas mensagens de erro bastante descritivas:
Com o GCC, você deve dar o seu consentimento
-Werror
para que ele realmente faça questão de não ser um programa C89 válido. Além disso, você ainda precisa usarc99
ougcc -std=c99
obter o idioma C99.fonte
gcc
geralmente deve ser chamado com pelo menos-Wall
, o que adverte para este programa.clang
produz bons avisos / erros, no entanto.gnu99
, egnu++98
egnu++0x
. Eu acho que essas são extensões genuínas , no entanto, ou seja, elas compilarão o código padrão ISO sem problemas. Aqui estão os detalhes: para C , para C ++ .Eu acho que o clang poderia ser uma alternativa.
GCC e clang têm algumas diferenças em expressões como
a+++++a
, e eu tenho muitas respostas diferentes com meus colegas que usam clang no Mac enquanto eu uso o gcc.O CCG se tornou o padrão e o clang pode ser uma alternativa. Porque o GCC é muito estável e o clang ainda está em desenvolvimento.
fonte
a+++++a
deve falhar, pois é analisado comoa ++ ++ + a
um erro de sintaxe.