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