Partilhar via


Aviso do compilador (nível 1) C5105

expansão de macro produzindo 'defined' tem comportamento indefinido

Comentários

O pré-processador detectou um operador defined na saída de uma expansão de macro. Se um operador defined aparecer como resultado de uma expansão de macro, o padrão C especificará o comportamento como indefinido. O aviso C5105 é um aviso de conformidade de portabilidade e padrões, e é emitido porque outros compiladores de conformidade podem ter um comportamento diferente. Para resolver esse problema, mova o operador defined para fora da macro ou suprima o aviso C5105.

Comportamento específico da Microsoft: o compilador MSVC avalia o operador defined normalmente, mesmo em /permissive-.

Este aviso é novo no Visual Studio 2017 versão 15.8. Ele é gerado apenas pelo novo pré-processador compatível com os padrões, especificado pela opção do compilador /experimental:preprocessor.

Para desativar o aviso sem alterações de código

Você pode desativar o aviso em uma linha de código específica usando o pragma de aviso, #pragma warning(suppress : 5105). Você também pode desativar o aviso dentro de um arquivo usando o pragma de aviso, #pragma warning(disable : 5105). Para desativar o aviso globalmente em builds de linha de comando, use a opção de linha de comando /wd5105.

Para desativar o aviso de um projeto inteiro no IDE do Visual Studio:

  1. Abra a caixa de diálogo Páginas de Propriedades do seu projeto. Para obter informações sobre como usar a caixa de diálogo Páginas de Propriedades, consulte Páginas de Propriedades.
  2. Selecione a página Propriedades de Configuração>C/C++>Avançadas.
  3. Edite a propriedade Desabilitar Avisos Específicos para adicionar 5105. Escolha OK para aplicar suas alterações.

Exemplo

Este programa de exemplo mostra como gerar o aviso C5105 e como corrigi-lo.

// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.

#include <iostream>

#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif

int main()
{
#if DEFINED_TEST  // C5105
    std::cout << "TEST defined\n";
#else
    std::cout << "TEST not defined\n";
#endif
}