O que a bandeira ms-extensions faz exatamente com o gcc?

o GCC tem uma bandeira {[[0]}.

O que é que esta bandeira faz exactamente? Por que às vezes Está ligado por padrão, e por que existe?

Author: M.M, 2019-06-12

1 answers

De acordo com o código-fonte do gcc 9.1.0 (coberto para flag_ms_extensions) os efeitos são:

    (C) permitir a versão da Microsoft de uniões e estruturas anônimas. Isto inclui o suporte para C11 uniões e estruturas anónimas , bem como sabores específicos da Microsoft, incluindo a omissão da lista de membros com chavetas, e a colocação de membros no espaço de nomes-mãe, mesmo que a estrutura/União tivesse um identificador.
  • (C++) permite que um membro da classe tenha o mesmo nome que seu tipo (por exemplo using foo = int; struct A { foo foo; }). Com o ms-extensions desativado, o comportamento é aceitar este código em C (onde é legal); ou um bloco extern "C" a menos que -pedantic tenha sido indicada a bandeira. A mensagem de erro para isto é declaration of NAME changes meaning of NAME.
  • (C++) permitir int implícito; qualquer situação que teria produzido o diagnóstico ISO C++ forbids declaration of NAME with no type é agora permitida, com int assumido como o tipo. Exemplos: const *p; ou const f();.
  • (C++) permitir a conversão implícita de um qualified-id nomear uma função membro não-estática, para um apontador para membro. Em ISO C++, o operador & é obrigado a efectuar essa conversão.
  • (C++) permitir &f formar um ponteiro-a-membro, se f (um id não qualificado) nomear uma função de Membro não sobrecarregada nesse contexto. O ISO C++ requer qualificação explícita com o nome da classe.

A bandeira é activada por omissão se o Abi alvo for um Abi da Microsoft. Pode ser desactivado especificando manualmente -fno-ms-extensions.


A lógica subjacente a isto é uma pergunta mais difícil. A documentação tem de dizer:

Aceitar algumas construções não-padrão usadas nos ficheiros de cabeçalho Microsoft.

Desactivar os avisos Wpedânticos sobre construções usadas no MFC.

Por isso, presumo que a lógica seja permitir que o g++ compile As aplicações MFC que dependem de códigos não-normalizados nos cabeçalhos fornecidos pelo fornecedor do MSVC.

Não tenho a certeza se isso ainda é relevante em 2019 e acho que um bom caso pode ser resolvido. o gcc por omissão para ter esta bandeira desligada. (Os usuários podem sempre especificá-lo se quiserem construir um aplicativo antigo MFC).

Por exemplo, MSVC 19.xx (a última versão até a data) já não permite os últimos três pontos em seu modo padrão. (Ele ainda permite foo foo; mesmo com /Za bandeira).

 7
Author: M.M, 2021-01-28 22:29:56