Compilerwarnung (Ebene 1) C5105
Die Makroerweiterung, die "definiert" erzeugt, weist ein nicht definiertes Verhalten auf.
Hinweise
Der Präprozessor hat einen defined
Operator in der Ausgabe einer Makroerweiterung erkannt. Wenn ein defined
Operator als Ergebnis einer Makroerweiterung angezeigt wird, gibt der C-Standard das Verhalten als nicht definiert an. Die C5105-Warnung ist eine Warnung zur Portabilität und Standardskonformität, die ausgegeben wird, da andere konforme Compiler möglicherweise ein anderes Verhalten aufweisen. Um dieses Problem zu beheben, verschieben Sie den Operator aus dem Makro, oder unterdrücken Sie die defined
Warnung C5105.
Microsoft-spezifisches Verhalten: Der MSVC-Compiler wertet den defined
Operator normal aus, auch unter /permissive-
.
Diese Warnung ist neu in Visual Studio 2017, Version 15.8. Er wird nur von dem neuen standardkonformen Präprozessor generiert, der von der /experimental:preprocessor
Compileroption angegeben wird.
So deaktivieren Sie die Warnung ohne Codeänderungen
Sie können die Warnung für eine bestimmte Codezeile mithilfe des Pragmas #pragma warning(suppress : 5105)
der Warnung deaktivieren. Sie können die Warnung in einer Datei auch mit dem Pragma #pragma warning(disable : 5105)
der Warnung deaktivieren. Sie können die Warnung global in Befehlszeilenbuilds mithilfe der Befehlszeilenoption "/wd5105 " deaktivieren.
So deaktivieren Sie die Warnung für ein gesamtes Projekt in der Visual Studio-IDE:
- Öffnen Sie das Dialogfeld "Eigenschaftenseiten " für Ihr Projekt. Informationen zur Verwendung des Dialogfelds "Eigenschaftenseiten" finden Sie unter "Eigenschaftenseiten".
- Wählen Sie die Seite "Konfigurationseigenschaften>C/C++>Erweitert" aus.
- Bearbeiten Sie die Eigenschaft "Bestimmte Warnungen deaktivieren", um sie hinzuzufügen
5105
. Wählen Sie "OK" aus, um Ihre Änderungen anzuwenden.
Beispiel
Dieses Beispielprogramm zeigt, wie Warnungen C5105 generiert und wie sie behoben werden.
// 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
}