O que a bandeira fpermissive faz?

121

Eu só estou querendo saber o que a -fpermissivebandeira faz no compilador g ++? Estou obtendo:

erro: obter endereço de temporário [-permissive]

que eu posso resolver dando a -fpermissivebandeira ao compilador.

EDIT : Acabei de encontrar o que estava causando a parte do erro de endereço temporário! Eu vou consertar essa parte agora.

mmirzadeh
fonte

Respostas:

146

Desde os documentos :

-fpermissive
Faça o downgrade de alguns diagnósticos sobre código não conforme de erros para avisos. Assim, usar -fpermissivepermitirá que algum código não conforme seja compilado.

Conclusão: não o use , a menos que saiba o que está fazendo!

cli_hlt
fonte
4
Espero mais informações do que o manual de cotação + "não as use até que você saiba o que está fazendo" com a resposta mais votada. Não preciso pesquisar no google para isso. Quais casos de código não conforme são rebaixados exatamente?
precisa
O código não conforme é rebaixado, mas o diagnóstico é de erros a avisos. Um exemplo é dado pelo abridor de perguntas. Se você não sabe quais seriam os casos extremos, não deve considerar usá-lo.
Cli_hlt 26/11/19
2
Desculpe cara, sem ofensa, mas conselhos como "não faça algo se você não souber as implicações" é trivial e se encaixa em todas as perguntas e não responde a nenhuma.
Johannes_lalala
3
.. e desculpe, mas apenas citar o manual sem elaborar nada não é útil. Especialmente em um caso em que o manual é muito escasso.
Johannes_lalala
50

O -fpermissivesinalizador faz com que o compilador relate algumas coisas que na verdade são erros (mas são permitidas por alguns compiladores) como avisos, para permitir que o código seja compilado mesmo que não esteja em conformidade com as regras de idioma. Você realmente deve corrigir o problema subjacente. Poste o menor exemplo de código compilável que demonstra o problema.

-fpermissive
Faça o downgrade de alguns diagnósticos sobre código não conforme de erros para avisos. Assim, usar -fpermissivepermitirá que algum código não conforme seja compilado.

David Schwartz
fonte
18

Quando você escreve algo que não é permitido pelo padrão da linguagem (e, portanto, não pode realmente ser um comportamento bem definido, o que é motivo suficiente para não fazê-lo), mas passa a ser mapeado para algum tipo de executável se alimentado ingenuamente. o mecanismo de compilação, -fpermissivefará exatamente isso em vez de parar com esta mensagem de erro. Em alguns casos, o programa se comportará exatamente como você pretendia originalmente, mas você definitivamente não deve confiar nele, a menos que tenha algum motivo muito especial para não usar outra solução.

leftaroundabout
fonte
3
Algo que não é permitido pelo padrão de idioma ainda pode ser bem definido. De fato, quase todo compilador possui extensões bem definidas. Mas não
estou
8

Se você deseja um caso de uso do mundo real para isso, tente compilar uma versão muito antiga do X Windows - digamos, XFree86 ou XOrg a partir de 2004, em torno da divisão - usando uma versão "moderna" (tosse) do gcc , como 4.9.3.

Você notará que o CFLAGS da compilação especifica "-ansi" e "-pedantic". Em teoria, isso significa "explodir se algo violar levemente as especificações da linguagem". Na prática, a série 3.x de gcc não capturou muito desse tipo de coisa, e construí-la com 4.9.3 deixará um buraco de fumaça no chão, a menos que você defina CFLAGS e BOOTSTRAPCFLAGS como "-permissive".

Usando esse sinalizador, a maioria desses arquivos C realmente será criada, deixando você livre para passar para os destroços dependentes da versão que o lexer irá gerar. =]

ponto de interrupção
fonte