Compartir a través de


Advertencia del compilador (nivel 1) C5105

expansión de macro que genera "defined" tiene un comportamiento indefinido

Comentarios

El preprocesador detectó un operador defined en la salida de una expansión de macros. Si un operador defined aparece como resultado de una expansión de macros, el estándar de C especifica el comportamiento como indefinido. C5105 es una advertencia de portabilidad y cumplimiento de estándares, y se genera porque otros compiladores conformes pueden tener un comportamiento diferente. Para resolver este problema, saque el operador defined de la macro o suprima la advertencia C5105.

Comportamiento específico de Microsoft: el compilador de MSVC evalúa el operador defined normalmente, incluso en /permissive-.

Esta advertencia es nueva en Visual Studio 2017, versión 15.8. Solo se genera mediante el nuevo preprocesador conforme a estándares, especificado por la opción del compilador /experimental:preprocessor.

Para desactivar la advertencia sin realizar cambios en el código

Para desactivar la advertencia en una línea de código concreta, utilice la pragma warning, #pragma warning(suppress : 5105). También se puede en un archivo mediante utilice la pragma warning, #pragma warning(disable : 5105). La advertencia se puede desactivar globalmente en compilaciones de línea de comandos mediante la opción de línea de comandos /wd5105.

Si desea desactivar la advertencia para un proyecto entero en el IDE de Visual Studio:

  1. Abra el diálogo Páginas de propiedades del proyecto. Para obtener información sobre cómo usar el cuadro de diálogo Páginas de propiedades, consulte Páginas de propiedades.
  2. Seleccione la página Propiedades de configuración>C/C++>Avanzadas.
  3. Edite la propiedad Deshabilitar advertencias específicas para agregar 5105. Seleccione Aceptar para aplicar los cambios.

Ejemplo

En este programa de ejemplo se muestra cómo generar la advertencia C5105 y cómo corregirla.

// 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
}