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? 6
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 blocoextern "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, comint
assumido como o tipo. Exemplos:const *p;
ouconst 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, sef
(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