Esta nota diz:
-ansi
: diz ao compilador para implementar a opção de idioma ANSI. Isso desativa certos "recursos" do GCC que são incompatíveis com o padrão ANSI.
-pedantic
: usado em conjunto com-ansi
, isso indica ao compilador para aderir estritamente ao padrão ANSI, rejeitando qualquer código que não seja compatível.
Primeiras coisas primeiro:
- Qual é o objetivo
-pedantic
e as-ansi
opções do compilador GCC / G ++ (não consegui entender a descrição acima)? - Alguém pode me dizer as circunstâncias corretas para usar essas duas opções?
- Quando devo usá-los?
- Eles são importantes?
Eu uso o tempo todo na minha codificação.
A
-ansi
bandeira é equivalente a-std=c89
. Como observado, ele desativa algumas extensões do GCC. A adição-pedantic
desativa mais extensões e gera mais avisos. Por exemplo, se você tiver uma literal de cadeia com mais de 509 caracteres,-pedantic
avisa sobre isso porque excede o limite mínimo exigido pelo padrão C89. Ou seja, todo compilador C89 deve aceitar cadeias de comprimento 509; eles têm permissão para aceitar mais, mas se você estiver sendo pedante, não é portátil usar cadeias mais longas, mesmo que um compilador possa aceitar cadeias mais longas e, sem os avisos pedantes, o GCC também as aceitará.fonte
-std=c89 -pedantic
significa que você pode mover-se mais facilmente entre diferentes compiladores em outras plataformas. Assim que você começa a usar<windows.h>
, a compatibilidade com outros sistemas se torna problemática.-pedantic
, mas a maior parte do meu código ainda compila OK quando eu o habilito novamente (o programa que não usava explicitamente__int128
tipos, que são pedanticamente incorretos). Eu acho que houve um estágio intermediário em que o GCC era muito barulhento (para o meu gosto)-pedantic
. Acabei de testar cerca de 300 arquivos de origem - algum código de biblioteca, alguns comandos, alguns programas de teste de SO - e havia apenas um problema esperado. Atualmente, usa o GCC 4.8.2 no Mac OS X 10.9.2.-ansi
é um comutador obsoleto que solicita que o compilador compile de acordo com a revisão obsoleta de 30 anos do padrão C , ISO / IEC 9899: 1990 , que é essencialmente uma nova marca do padrão ANSI X3.159-1989 "Linguagem de programação C" . Por que obsoleto? Depois que o C90 foi publicado pela ISO, a ISO ficou encarregada da padronização C. As correções técnicas do C90 foram publicadas pela ISO. Portanto, é mais adequado usar o-std=c90
.Sem essa opção, os compiladores recentes do GCC C estarão em conformidade com o idioma C padronizado na ISO / IEC 9899: 2011 ou na revisão mais recente de 2018.
Infelizmente, existem alguns fornecedores de compiladores preguiçosos que acreditam que é aceitável manter uma revisão padrão obsoleta mais antiga, para a qual o documento de padronização nem sequer está disponível nos órgãos padrão.
O uso da opção ajuda a garantir que o código seja compilado nesses compiladores obsoletos.
O
-pedantic
é interessante. Na ausência de-pedantic
, mesmo quando um padrão específico é solicitado, o GCC ainda permitirá algumas extensões que não são aceitáveis no padrão C. Considere, por exemplo, o programaO projeto C11 n1570, parágrafo 6.7.6.2p1, diz :
O padrão C exige que o comprimento da matriz seja maior que zero; e este parágrafo está nas restrições ; o padrão diz o seguinte 5.1.1.3p1 :
No entanto, se você compilar o programa
gcc -c -std=c90 pedantic_test.c
, nenhum aviso será produzido.-pedantic
faz com que o compilador realmente cumpra o padrão C ; então agora ele produzirá uma mensagem de diagnóstico, conforme exigido pelo padrão:Portanto, para obter a portabilidade máxima, especificar a revisão padrão não é suficiente, você também deve usar
-pedantic
(ou-pedantic-errors
) para garantir que o GCC realmente cumpra a letra do padrão.A última parte da pergunta foi sobre o uso
-ansi
com C ++ . O ANSI nunca padronizou a linguagem C ++ - apenas adotou-a da ISO, e isso faz tanto sentido quanto dizer "inglês como padronizado pela França". No entanto, o GCC ainda parece aceitá-lo para C ++, por mais estúpido que pareça.fonte
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Basicamente, isso tornará seu código muito mais fácil de ser compilado em outros compiladores que também implementam o padrão ANSI e, se você for cuidadoso com as chamadas de bibliotecas / API que você usa, em outros sistemas / plataformas operacionais.
O primeiro, desativa os recursos ESPECÍFICOS do GCC. (-ansi) O segundo, reclamará de QUALQUER COISA que não adira ao padrão (não apenas recursos específicos do GCC, mas também suas construções.) (-pedantic).
fonte
Se seu código precisar ser portátil , você poderá testar se ele é compilado sem nenhuma extensão gcc ou outros recursos não-padrão. Se o seu código compilar com
-pedantic -ansi
ele, em teoria, ele deverá compilar OK com qualquer outro compilador padrão ANSI.fonte
-pedantic
não desativa todas as extensões, deixa um monte de coisas com sublinhado duplo. Portanto, pode ser mais preciso dizer que, se seu código for compilado com-pedantic -ansi
, e também parecer plausível que possa ser compilado em outras implementações, ele será compilado.Se você estiver escrevendo o código que você imagina que será compilado em uma ampla variedade de plataformas, com vários compiladores diferentes, o uso desses sinalizadores ajudará a garantir que você não produza código que apenas seja compilado no GCC.
fonte
Outros responderam suficientemente. Gostaria apenas de adicionar alguns exemplos de extensões frequentes:
A
main
função retornandovoid
. Isso não é definido pelo padrão, o que significa que funcionará apenas em alguns compiladores (incluindo o GCC), mas não em outros. A propósito,int main()
eint main(int, char**)
são as duas assinaturas que o padrão define.Outra extensão popular é poder declarar e definir funções dentro de outras funções:
Isso não é padrão. Se você deseja esse tipo de comportamento, confira C ++ 11 lambdas
fonte
O Pedantic faz com que o compilador gcc rejeite todas as extensões GNU C e não apenas as que o tornam compatível com ANSI.
fonte