Udostępnij za pośrednictwem


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:

  1. 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.
  2. Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
  3. Edytuj właściwość Wyłącz określone ostrzeżenia, aby dodać 5105element . 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
}