Condividi tramite


Avviso del compilatore (livello 1) C5105

L'espansione di macro che produce 'defined' ha un comportamento indefinito

Osservazioni:

Il preprocessore ha rilevato un defined operatore nell'output di un'espansione di macro. Se un defined operatore viene visualizzato come risultato di un'espansione di macro, lo standard C specifica il comportamento non definito. L'avviso C5105 è un avviso di portabilità e conformità agli standard, generato perché altri compilatori conformi possono avere un comportamento diverso. Per risolvere questo problema, spostare l'operatore dalla macro o eliminare l'avviso defined C5105.

Comportamento specifico di Microsoft: il compilatore MSVC valuta normalmente l'operatore defined , anche in /permissive-.

Questo avviso è una novità di Visual Studio 2017 versione 15.8. Viene generato solo dal nuovo preprocessore conforme agli standard, specificato dall'opzione del /experimental:preprocessor compilatore.

Per disattivare l'avviso senza modifiche al codice

È possibile disattivare l'avviso per una riga di codice specifica usando il pragma di avviso , #pragma warning(suppress : 5105). È anche possibile disattivare l'avviso all'interno di un file usando il pragma di avviso , #pragma warning(disable : 5105). È possibile disattivare l'avviso a livello globale nelle compilazioni della riga di comando usando l'opzione della riga di comando /wd5105 .

Per disattivare l'avviso per un intero progetto nell'IDE di Visual Studio:

  1. Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per informazioni su come usare la finestra di dialogo Pagine delle proprietà, vedere Pagine delle proprietà.
  2. Selezionare la pagina Proprietà>di configurazione C/C++>Avanzate.
  3. Modificare la proprietà Disabilita avvisi specifici per aggiungere 5105. Scegliere OK per applicare le modifiche.

Esempio

Questo programma di esempio illustra come generare l'avviso C5105 e come risolverlo.

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