Ostrzeżenie kompilatora (poziom 1) C5105
Rozszerzenie makr tworzące "zdefiniowane" ma niezdefiniowane zachowanie
Uwagi
Preprocesor wykrył defined
operator w danych wyjściowych rozszerzenia makra. defined
Jeśli operator pojawi się w wyniku rozszerzenia makra, standard C określa zachowanie jako niezdefiniowane. Ostrzeżenie C5105 to ostrzeżenie dotyczące przenośności i zgodności ze standardami, wydane, ponieważ inne zgodne kompilatory mogą mieć inne zachowanie. Aby rozwiązać ten problem, przenieś defined
operator z makra lub pomiń ostrzeżenie C5105.
Zachowanie specyficzne dla firmy Microsoft: kompilator MSVC ocenia defined
operator normalnie, nawet w obszarze /permissive-
.
To ostrzeżenie jest nowe w programie Visual Studio 2017 w wersji 15.8. Jest generowany tylko przez nowy preprocesor zgodny ze standardami określony przez opcję kompilatora /experimental:preprocessor
.
Aby wyłączyć ostrzeżenie bez zmian kodu
Ostrzeżenie dla określonego wiersza kodu można wyłączyć przy użyciu ostrzeżenia pragma , #pragma warning(suppress : 5105)
. Możesz również wyłączyć ostrzeżenie w pliku przy użyciu ostrzeżenia pragma, #pragma warning(disable : 5105)
. Ostrzeżenie można wyłączyć globalnie w kompilacjach wiersza polecenia przy użyciu opcji wiersza polecenia /wd5105 .
Aby wyłączyć ostrzeżenie dotyczące całego projektu w środowisku IDE programu Visual Studio:
- Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać informacje na temat korzystania z okna dialogowego Strony właściwości, zobacz Strony właściwości.
- Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
- Edytuj właściwość Wyłącz określone ostrzeżenia, aby dodać
5105
element . Wybierz przycisk OK , aby zastosować zmiany.
Przykład
Ten przykładowy program pokazuje, jak wygenerować ostrzeżenie C5105 i jak go naprawić.
// 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
}