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:
- 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.
- Selecione a página Propriedades de Configuração>C/C++>Avançadas.
- 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
}