Поделиться через


Предупреждение компилятора (уровень 1) C5105

Расширение макросов, создающее "определенный", имеет неопределенное поведение

Замечания

Препроцессор обнаружил defined оператор в выходных данных расширения макроса. defined Если оператор отображается в результате расширения макроса, стандарт C указывает поведение как неопределенное. Предупреждение C5105 — это предупреждение о переносимости и соответствия стандартам, выданное, так как другие компиляторы соответствия могут иметь другое поведение. Чтобы устранить эту проблему, переместите defined оператор из макроса или отключите предупреждение C5105.

Поведение, определенное корпорацией Майкрософт: компилятор MSVC обычно вычисляет defined оператор даже под /permissive-.

Это предупреждение новое в Visual Studio 2017 версии 15.8. Он создается только новым препроцессором, соответствующим стандартам, заданным параметром компилятора /experimental:preprocessor .

Отключение предупреждения без изменений кода

Вы можете отключить предупреждение для определенной строки кода с помощью предупреждения pragma. #pragma warning(suppress : 5105) Вы также можете отключить предупреждение в файле с помощью предупреждения pragma. #pragma warning(disable : 5105) Вы можете отключить предупреждение глобально в сборках командной строки с помощью параметра командной строки /wd5105 .

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

  1. Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
  2. Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
  3. Измените свойство Disable Specific Warnings to add 5105. Нажмите кнопку "ОК ", чтобы применить изменения.

Пример

В этом примере программы показано, как создать предупреждение C5105 и как исправить его.

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