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:
- 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à.
- Selezionare la pagina Proprietà>di configurazione C/C++>Avanzate.
- 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
}