Qual é o objetivo de usar -pedantic no compilador GCC / G ++?

136

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 -pedantice as -ansiopçõ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?
huahsin68
fonte

Respostas:

84

Os compiladores do GCC sempre tentam compilar seu programa, se isso for possível. No entanto, em alguns casos, os padrões C e C ++ especificam que certas extensões são proibidas. Compiladores em conformidade, como gcc ou g ++, devem emitir um diagnóstico quando essas extensões forem encontradas. Por exemplo, a opção -pedantic do compilador gcc faz com que o gcc emita avisos nesses casos. O uso da -pedantic-errorsopção mais rígida converte esses avisos de diagnóstico em erros que causarão falha na compilação nesses momentos. Somente as construções não ISO que precisam ser sinalizadas por um compilador em conformidade gerarão avisos ou erros.

Wazery
fonte
3
Os padrões ISO C e C ++ apenas "proíbem extensões", pois a extensão não deve alterar o comportamento de nenhum programa em conformidade. O compilador não é forçado a rejeitar nenhum programa que use extensões.
1616 MM
@MM: É importante observar que, quando alguns compiladores aceitavam uma construção útil e outros a rejeitavam, o "compromisso" do Comitê era ter uma implementação conforme, emitindo um diagnóstico que os programadores poderiam ignorar, evitando assim a necessidade do Comitê ordenar ou proibir a construção.
supercat 14/03
105

Eu uso o tempo todo na minha codificação.

A -ansibandeira é equivalente a -std=c89. Como observado, ele desativa algumas extensões do GCC. A adição -pedanticdesativa mais extensões e gera mais avisos. Por exemplo, se você tiver uma literal de cadeia com mais de 509 caracteres, -pedanticavisa 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á.

Jonathan Leffler
fonte
-ansi desativa algumas extensões do GCC, enquanto -pedantic desativa mais extensões. Parece que -ansi é regra de primeiro nível e depois -pedantic é regra mais restrita. Isso significa que, com essas duas opções de remoção, posso ter meu código mais compatível com outro compilador como o Microsoft?
Huahsin68 19/05/10
4
@ huahsin68: bem, mais ou menos. O MSVC é um compilador bastante diferente da maioria dos outros, mais adaptado ao seu ecossistema específico e não disponível fora dele. Ele faz muitas coisas à sua maneira - o que não é o mesmo que o padrão. No entanto, se você permanecer com os cabeçalhos padrão e assim por diante, o MSVC e o GCC serão bastante semelhantes. No entanto, usar -std=c89 -pedanticsignifica 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.
Jonathan Leffler
2
@slf: Porque, como qualquer outro fornecedor (embora o GNU não venda seu compilador por dinheiro), eles gostariam que você usasse seus recursos proprietários? Ou, de maneira mais geral, porque consideram as extensões úteis e pensam que devem estar ativadas por padrão.
31812 Jonathan Lefler
1
Por tudo o que vale a pena, e JFTR , parei de usar -pedantic, mas a maior parte do meu código ainda compila OK quando eu o habilito novamente (o programa que não usava explicitamente __int128tipos, 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.
Jonathan Leffler
1
@ JonathanLeffler, Sim, estou perguntando qual é o nome de um compilador real na prática, onde isso não funcionaria? Existe mesmo um compilador?
Pacerier 8/03/15
23

-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 programa

struct test {
    int zero_size_array[0];
};

O projeto C11 n1570, parágrafo 6.7.6.2p1, diz :

Além dos qualificadores de tipo opcionais e da palavra-chave static, o [e] pode delimitar uma expressão ou *. Se eles delimitarem uma expressão (que especifica o tamanho de uma matriz), a expressão deverá ter um tipo inteiro. Se a expressão for uma expressão constante, ela deverá ter um valor maior que zero. [...]

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 :

Uma implementação em conformidade deve produzir pelo menos uma mensagem de diagnóstico (identificada de uma maneira definida pela implementação) se uma unidade de conversão de pré-processamento ou unidade de tradução contiver uma violação de qualquer regra ou restrição de sintaxe, mesmo que o comportamento também seja especificado explicitamente como indefinido ou de implementação. definiram. As mensagens de diagnóstico não precisam ser produzidas em outras circunstâncias.

No entanto, se você compilar o programa gcc -c -std=c90 pedantic_test.c, nenhum aviso será produzido.

-pedanticfaz 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:

gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array zero_size_array [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~

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 -ansicom 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.

Antti Haapala
fonte
4
Observe que houve outras revisões do padrão de idioma. Hoje eu normalmente compilar com -std=c11 -Wall -Wextra -Wpedantic -Wconversion.
Davislor
14

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).

Francisco Soto
fonte
6

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 -ansiele, em teoria, ele deverá compilar OK com qualquer outro compilador padrão ANSI.

Paul R
fonte
4
-pedanticnã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.
Steve Jessop
3
Você menciona coisas com sublinhado duplo, esse som é interessante. A que exatamente você está se referindo?
Huahsin68 19/05/10
Um exemplo é o código de montagem em linha "__asm ​​__ ()" do gcc, que é bom para o gcc, mas essa coisa de sublinhado duplo pode não funcionar em um compilador do Windows, mesmo que esse compilador esteja em conformidade com o padrão.
3

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.

Damien_The_Unbeliever
fonte
2
sob algumas versões do GCC!
Mohamed Amjad LASRI
1

Outros responderam suficientemente. Gostaria apenas de adicionar alguns exemplos de extensões frequentes:

A mainfunção retornando void. 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:

void f()
{
    void g()
    {
       // ...
    }

    // ...
    g();
    // ...
}

Isso não é padrão. Se você deseja esse tipo de comportamento, confira C ++ 11 lambdas

Enn Michael
fonte
0

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.

Martin Konecny
fonte
1
Isso é tão interessante. Você mencionou a extensão GNU C, e essa extensão pode ou não estar no padrão ANSI. Posso ter mais informações sobre isso. Onde posso obter esses recursos apropriados?
Huahsin68 19/05/10