Avisos de compilador desativados por padrão

O compilador inclui avisos que são desativados por padrão, pois a maioria dos desenvolvedores não deseja vê-los. Em alguns casos, eles alertam sobre uma escolha estilística ou sobre idiomas comuns em código mais antigo. Outros avisos são sobre o uso de uma extensão da Microsoft para a linguagem. Alguns avisos indicam uma área em que os programadores geralmente fazem suposições incorretas, o que pode levar a um comportamento inesperado ou indefinido. Se todos esses avisos estiverem habilitados, alguns deles poderão aparecer muitas vezes em cabeçalhos de biblioteca. As bibliotecas de runtime C e as bibliotecas padrão C++ destinam-se a não emitir avisos somente no nível de aviso /W4.

Habilitar avisos desativados por padrão

Você pode habilitar avisos que normalmente estão desativados por padrão usando uma das seguintes opções:

  • #pragma warning(default :warning_number)

    O aviso especificado (warning_number) é habilitado no nível padrão. A documentação para o aviso contém o nível padrão do aviso.

  • #pragma warning(warning_level:warning_number)

    O aviso especificado (warning_number) é habilitado no nível especificado (warning_level).

  • /Wall

    /Wall habilita todos os avisos que são desativados por padrão. Se você usar essa opção, poderá desativar avisos individuais usando a opção /wd.

  • /wLnnnn

    Essa opção habilita o aviso nnnn no nível L.

Avisos desativados por padrão

Visual Studio 2015 e versões posteriores

Os seguintes avisos são desativados por padrão no Visual Studio 2015 e versões posteriores:

Aviso Mensagem
C4061 (nível 4) enumerador 'identificador' em uma opção de enum 'enumeração' não é explicitamente manipulado por um rótulo de maiúsculas e minúsculas.
C4062 (nível 4) enumerador 'identificador' em uma opção de enum 'enumeração' não é manipulado.
C4165 (nível 1) 'HRESULT' está sendo convertido para 'bool'; você tem certeza de que quer isso?
C4191 (nível 3) 'operator': conversão não segura de 'type_of_expression' para 'type_required'
C4242 (nível 4) 'identifier': conversão de 'type1' para 'type2', possível perda de dados
C4254 (nível 4) 'operator': conversão de 'type1' para 'type2', possível perda de dados
C4255 (nível 4) 'function': nenhum protótipo de função fornecido: convertendo '()' em '(void)'
C4263 (nível 4) 'function': a função membro não substitui nenhuma função membro virtual da classe base
C4264 (nível 1) 'virtual_function': nenhuma substituição disponível para função membro virtual da 'class' base; a função é ocultada
C4265 (nível 3) 'class': a classe tem funções virtuais, mas o destruidor não é virtual
C4266 (nível 4) 'function': nenhuma substituição disponível para função membro virtual do 'type' base; a função é ocultada
C4287 (nível 3) 'operator': incompatibilidade de constante sem sinal/negativa
C4289 (nível 4) extensão não padrão usada: 'var': variável de controle de loop declarada no loop for é usada fora do escopo do loop for
C4296 (nível 4) 'operator': a expressão sempre é falsa
C4339 (nível 4) 'type': uso de tipo indefinido detectado no metadados do CLR – usar esse tipo pode gerar uma exceção de tempo de execução
C4342 (nível 1) alteração de comportamento: 'function' é chamado, mas um operador de membro foi chamado em versões anteriores
C4350 (nível 1) alteração de comportamento: 'member1' chamado no lugar de 'member2'
C4355 'this' : usado na lista de inicializadores do membro base
C4365 (nível 4) 'action' : conversão de 'type_1' para 'type_2', incompatibilidade assinada/não assinada
C4370 (nível 3) layout da classe foi alterado de uma versão anterior do compilador devido a empacotamento melhor
C4371 (nível 3) 'class-name': o layout da classe pode ter mudado de uma versão anterior do compilador devido ao melhor empacotamento do membro 'member'
C4388 (nível 4) incompatibilidade de signed/unsigned
C4412 (nível 2) 'function': a assinatura de função contém o tipo 'type'; não é seguro passar objetos C++ entre código puro e combinado ou nativo
C4426 (level 1) os sinalizadores de otimização foram alterados após incluir o cabeçalho, pode ser devido ao #pragma optimize() 14.1
C4435 (nível 4) 'class1' : O layout do objeto em /vd2 será alterado devido à base virtual 'class2'.
C4437 (nível 4) dynamic_cast da base virtual 'class1' para 'class2' pode falhar em alguns contextos.
C4444 (nível 3) O "__unaligned" de nível superior não é implementado neste contexto.
C4464 (nível 4) o caminho de inclusão relativo contém '..'
C4471 (nível 4) uma declaração de encaminhamento de uma enumeração sem escopo deve ter um tipo subjacente (int assumido) Perm
C4472 (nível 1) 'identifier' é um enum nativo: adicione um especificador de acesso (privado/público) para declarar um enum gerenciado
C4514 (nível 4) 'function': a função embutida desreferenciada foi removida
C4536 (nível 4) 'type name': o nome de tipo excede o limite de metadados de 'limit' caracteres
C4545 (nível 1) expressão antes da vírgula é avaliada para uma função que está ausente em uma lista de argumentos
C4546 (nível 1) faltando lista de argumentos na chamada de função antes da vírgula
C4547 (nível 1) 'operator': o operador antes da vírgula não tem efeito; um operador com efeito colateral era esperado
C4548 (nível 1) expressão antes da vírgula não tem efeito; expressão esperada com efeito colateral
C4549 (nível 1) 'operator1': o operador antes da vírgula não tem efeito; você quis dizer 'operator2'?
C4555 (nível 1) expressão não tem efeito; expressão esperada com efeito colateral
C4557 (nível 3) '__assume' contém o efeito 'effect'
C4571 (nível 4) Informativo: a semântica catch(...) foi alterada desde o Visual C++ 7.1; exceções estruturadas (SEH) não são mais capturadas
C4574 (level 4) 'identifier' é definido para ser '0': você quis usar '#if identifier'?
C4577 (nível 1) 'noexcept' usado sem modo de tratamento de exceção especificado; o encerramento em caso de exceção não é garantido. Especifique /EHsc
C4582 (nível 4) 'type': o construtor não foi chamado implicitamente
C4583 (nível 4) 'type': o destruidor não foi chamado implicitamente
C4587 (level 1) 'anonymous_structure': alteração de comportamento: o construtor não é mais chamado implicitamente
C4588 (nível 1) 'anonymous_structure': alteração de comportamento: o destruidor não é mais chamado implicitamente
C4596 (nível 4) 'identifier': nome qualificado inválido na declaração de membro 14.3Perm
C4598 (nível 1 e nível 3) '#include "header"': o número do cabeçalho header-number no cabeçalho pré-compilado não corresponde à compilação atual nessa posição 14.3
C4599 (nível 3) 'caminho da opção': o número do argumento da linha de comando arg_number não corresponde ao cabeçalho pré-compilado 14.3
C4605 (level 1) '/Dmacro' especificado na linha de comando atual, porém não foi especificado quando o cabeçalho pré-compilado foi criado
C4608 (nível 3) 'union_member' já foi inicializado por outro membro de união na lista de inicializadores, 'union_member' Perm
C4619 (nível 3) aviso #pragma: não há número de aviso 'number'
C4623 (nível 4) 'derived class': construtor padrão não pôde ser gerado porque o construtor padrão de uma classe base está inacessível
C4625 (nível 4) 'derived class': construtor de cópia não pôde ser gerado porque o construtor de cópia de uma classe base está inacessível
C4626 (nível 4) 'derived class': operador de atribuição não pôde ser gerado porque o operador de atribuição de uma classe base está inacessível
C4628 (nível 1) dígrafos não suportados com -Ze. A sequência de caracteres 'digraph' não é interpretada como token alternativo para 'char'
C4640 (nível 3) 'instance': construção de objeto estático local não é thread-safe
C4643 (nível 4) Encaminhar a declaração de 'identifier' no namespace std não é permitido pelo padrão C++. 15.8
C4647 (nível 3) mudança de comportamento: __is_pod(type) tem um valor diferente em versões anteriores
C4654 (nível 4) O código colocado antes da inclusão da linha de cabeçalho pré-compilado será ignorado. Adicionar código ao cabeçalho pré-compilado. 14.1
C4668 (nível 4) 'symbol' não é definido como uma macro de pré-processador, substituindo por '0' para 'directives'
C4682 (nível 4) 'symbol' : nenhum atributo de parâmetro direcional especificado, padronizando para [in]
C4686 (nível 3) 'user-defined type': possível alteração no comportamento, alteração na convenção de chamada de retorno UDT
C4692 (nível 1) 'function': assinatura de membro não privado contém tipo nativo privado de assembly 'native_type'
'C4710 (nível 4) ''function': função não embutida
C4738 (nível 3) armazenando o resultado float de 32 bits na memória, possível perda de desempenho
C4746 acesso volátil de 'expression' está sujeito à configuração /volatile:<iso|ms>; considere usar funções intrínsecas do __iso_volatile_load/store
C4749 (nível 4) com suporte condicional: offsetof aplicado ao tipo de layout não padrão 'type'
C4767 (nível 4) nome da seção 'symbol' tem mais de 8 caracteres e será truncado pelo vinculador
C4774 (nível 4) 'string': a cadeia de caracteres de formato esperado no argumento number não é um literal de cadeia de caracteres
C4777 (nível 4) 'function': a cadeia de caracteres de formato 'string' exige um argumento do tipo 'type1', mas o argumento variádico number tem o tipo 'type2'
C4786 (nível 3) 'symbol' : o nome do objeto foi truncado para caracteres 'number' nas informações de depuração
C4800 (nível 4) Conversão implícita de 'type' em bool. Possível perda de informações 16.0
C4820 (nível 4) preenchimento de bytes 'bytes' adicionado após construção de 'member_name'
C4822 (nível 1) 'member': a função membro da classe local não tem um corpo
C4826 (nível 2) A conversão de 'type1' em 'type2' é estendida por sinal. Isso pode causar comportamento de tempo de execução inesperado.
C4837 (nível 4) trígrafo detectado: '??character' substituído por 'character'
C4841 (nível 4) extensão não padrão usada: designador de membro composto usado em offsetof
C4842 (nível 4) não é garantido que o resultado de 'offsetof' aplicado a um tipo usando a herança múltipla seja consistente entre versões do compilador
C4866 (nível 4) O compilador 'file(line_number)' pode não impor a ordem de avaliação da esquerda para a direita para chamar para o operator
C4868 (nível 4) O compilador 'file(line_number)' pode não impor a ordem de avaliação da esquerda para a direita na lista de inicializadores entre chaves
C4905 (nível 1) literal amplo de cadeia de caracteres convertido em 'LPSTR'
C4906 (nível 1) literal de cadeia de caracteres convertido em 'LPWSTR'
C4917 (nível 1) 'declarator': um GUID pode ser associado apenas a uma classe, uma interface ou um namespace
C4928 (nível 1) inicialização de cópia ilegal; mais de uma conversão definida pelo usuário foi implicitamente aplicada
C4931 (nível 4) estamos supondo que a biblioteca de tipos foi criada para ponteiros de bit por número
C4946 (nível 1) reinterpret_cast usado entre classes relacionadas: 'class1' e 'class2'
C4962 'function': otimizações guiadas por perfil desabilitadas porque as otimizações tornaram os dados de perfil inconsistentes
C4986 (nível 4) 'symbol': especificação de exceção não corresponde à declaração anterior
C4987 (nível 4) extensão não padrão usada: 'throw (...)'
C4988 (nível 4) 'symbol': variável declarada fora do escopo de classe/função
C5022 'type': vários construtores de movimento especificados
C5023 'type': vários operadores de atribuição de movimento especificados
C5024 (nível 4) 'type': o construtor de movimento foi implicitamente definido como excluído
C5025 (nível 4) 'type': o operador de atribuição de movimento foi implicitamente definido como excluído
C5026 (nível 1 e nível 4) 'type': o construtor de movimento foi implicitamente definido como excluído
C5027 (nível 1 e nível 4) 'type': o operador de atribuição de movimento foi implicitamente definido como excluído
C5029 (nível 4) extensão não padrão usada: os atributos de alinhamento no C++ se aplicam somente a variáveis, membros de dados e tipos de marcas
C5031 (nível 4) #pragma warning(pop): provável incompatibilidade, estado de aviso mostrado enviado por push em um arquivo diferente 14.1
C5032 (nível 4) #pragma warning(push) detectado sem nenhum #pragma warning(pop) correspondente 14.1

Visual Studio 2017 e versões posteriores

Os seguintes avisos são desativados por padrão no Visual Studio 2017 e versões posteriores:

Aviso Mensagem
C5034 uso da intrínseca 'intrinsic' faz com que a função function-name seja compilada como código de convidado 15.3
C5035 o uso do recurso 'feature' faz com que a função function-name seja compilada como um código de convidado 15.3
C5036 (nível 1) conversão do ponteiro da função varargs ao compilar com /hybrid:x86arm64 'type1' para 'type2' 15.3
C5038 (nível 4) o membro de dados 'member1' será inicializado após o membro de dados 'member2' 15.3
C5039 (nível 4) «função»: ponteiro ou referência à função potencialmente lançadora passada para a função C externa em -EHc. O comportamento indefinido poderá ocorrer se essa função lançar uma exceção. 15.5
C5041 (nível 4) 'member-name': a definição fora de linha para o membro de dados estáticos de constexpr não é necessária está preterida no C++17. 15.2
C5042 (nível 3) 'function': declarações de função em um escopo de bloco não podem ser especificadas como "embutidas" em C++ padrão; remova o especificador "embutido" 15.5
C5045 O compilador inserirá a mitigação Spectre para a carga de memória se a opção /Qspectre for especificada 15.7

Visual Studio 2019 e versões posteriores

Os seguintes avisos são desativados por padrão no Visual Studio 2019 e versões posteriores:

Aviso Mensagem
C5052 (nível 3) A palavra-chave 'keyword-name' foi introduzida na versão C++ e requer o uso da opção de linha de comando 'option' 16.1
C5204 (nível 3) Uma classe com funções virtuais tem um destruidor trivial não virtual. 16.5
C5214 (nível 4) a aplicação de 'keyword' a um operando com um tipo qualificado volátil foi preterido em C++20 16.7
C5215 (nível 4) 'function-parameter' um parâmetro de função com um tipo qualificado volátil, foi preterido em C++20 16.7
C5216 (nível 4) 'return-type', um tipo de retorno qualificado volátil, foi preterido no C++20 16.7
C5217 (nível 4) uma declaração de associação estruturada que inclui volátil foi preterida em C++20 16.7
C5219 (nível 2) conversão implícita de 'type-1' para 'type-2'. Possível perda de dados 16.7
C5220 (nível 4) 'member': um membro de dados não estático com um tipo qualificado volátil não implica mais que
Construtores de cópia/movimentação gerados pelo compilador e operadores de atribuição de cópia/movimentação não são triviais 16.7
C5233 (nível 4) a captura de lambda explícita 'identifier' não é usada 16.10
C5240 (nível 4) 'attribute-name': o atributo foi ignorado nesta posição sintática 16.10
C5243 (nível 1) 'type-name': usar uma classe 'class-name' incompleta pode causar uma possível violação da regra de definição devido à limitação de ABI 16.10
C5245 (nível 4) 'function': a função não referenciada com vinculação interna foi removida
C5246 (nível 1) 'member': a inicialização de um subobjeto deve ser colocada entre chaves 16.10
C5247 (level 1) A seção 'section-name' é reservada para inicialização dinâmica C++. A criação manual da seção interferirá na inicialização dinâmica do C++ e pode levar a um comportamento indefinido 16.11
C5248 (nível 1) A seção 'section-name' é reservada para inicialização dinâmica C++. As variáveis colocadas manualmente na seção podem ser otimizadas e sua ordem em relação aos inicializadores dinâmicos gerados pelo compilador não é especificada 16.11

Visual Studio 2022 e versões posteriores

Os seguintes avisos são desativados por padrão no Visual Studio 2022 e versões posteriores:

Aviso Mensagem
C5249 (nível 1) 'bitfield' do tipo 'enumeration_name' nomeou enumeradores com valores que não podem ser representados na largura de campo de bit fornecida de 'bitfield_width'. 17.0
C5250 (nível 3) 'function_name': função intrínseca não declarada. 17.0
C5251 (nível 4) nome-do-segmento alterado após incluir cabeçalho 17.1
C5254 (nível 4) o recurso de linguagem 'terse static assert' requer o sinalizador do compilador '/std:c++17' 17.1
C5256 (nível 1) 'enumeração':uma declaração não definidora de uma enumeração com um tipo subjacente fixo só é permitida como uma declaração autônoma 17.2
C5258 (nível 4) A captura explícita de 'símbolo' não é necessária para esse uso 17.2
C5259 (nível 4) 'tipo especializado': especialização explícita requer ''template <> 17.3
C5262 (nível 1, erro) a queda implícita ocorre aqui; Está faltando uma break declaração? Utilizar [[fallthrough]] quando uma break declaração é intencionalmente omitida entre os casos 17.4
C5263 (nível 4) Chamar ''std::move em um objeto temporário impede a elisão de cópia 17.4
C5264 (nível 4) 'variable-name': a variável 'const' não é usada 17.4
C5266 (nível 4) O qualificador 'CONST' no tipo de retorno não tem efeito 17.6
C5267 (nível 4) A definição de construtor/operador de atribuição de cópia implícita para 'tipo' foi preterida porque tem um operador de atribuição/construtor de cópia fornecido pelo usuário 17.7

14.1 Este aviso está disponível a partir do Visual Studio 2015 Atualização 1.
14.3 Este aviso está disponível a partir do Visual Studio 2015 Atualização 3.
15.2 Este aviso está disponível a partir do Visual Studio 2017 versão 15.2.
15.3 Este aviso está disponível a partir do Visual Studio 2017 versão 15.3.
15.5 Este aviso está disponível a partir do Visual Studio 2017 versão 15.5.
15.7 Este aviso está disponível a partir do Visual Studio 2017 versão 15.7.
15.8 Este aviso está disponível a partir do Visual Studio 2017 versão 15.8.
16.0 Este aviso está disponível a partir do Visual Studio 2019 RTM.
16.5 Este aviso está disponível a partir do Visual Studio 2019 versão 16.5.
16.7 Este aviso está disponível a partir do Visual Studio 2019 versão 16.7.
16.10 Este aviso está disponível a partir do Visual Studio 2019 versão 16.10.
16.11 Este aviso está disponível a partir do Visual Studio 2019 versão 16.11.
17.0 Este aviso está disponível a partir do Visual Studio 2022 versão 17.0.
17.1 Este aviso está disponível a partir do Visual Studio 2022 versão 17.1.
17.2 Este aviso está disponível a partir do Visual Studio 2022 versão 17.2.
17.3 Este aviso está disponível a partir do Visual Studio 2022 versão 17.3.
17.4 Este aviso está disponível a partir do Visual Studio 2022 versão 17.4.
17.5 Este aviso está disponível a partir do Visual Studio 2022 versão 17.5.
17.6 Este aviso está disponível a partir do Visual Studio 2022 versão 17.6.
17.7 Esse aviso está disponível a partir do Visual Studio 2022 versão 17.7.
Permanente Esse aviso está desativado, a menos que a opção do compilador /permissive- esteja definida.

Avisos desativados por padrão em versões anteriores

Esse aviso foi desativado por padrão no Visual Studio 2015 versão 15.3 e habilitado no Visual Studio 2015 versão 15.5:

Aviso Mensagem
C4768 os atributos __declspec antes da especificação de vínculo são ignorados

Esses avisos foram desativados por padrão em versões do compilador antes do Visual Studio 2015:

Aviso Mensagem
C4302 (nível 2) 'conversion': truncamento de 'type1' para 'type2'
C4311 (nível 1) 'variable': truncamento de ponteiro de type' para 'type'
C4312 (nível 1) 'operation': conversão de 'type1' em 'type2' de tamanho maior
C4319 (nível 1) 'operator' : zero estendendo 'type1' para 'type2' de maior tamanho

Esses avisos foram desativados por padrão em versões do compilador antes do Visual Studio 2012:

Aviso Mensagem
C4431 (nível 4) faltando especificador de tipo - int assumido. Observação: C não suporta mais default-int

Confira também

Pragma warning