Предупреждение компилятора (уровень 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, выполните следующие действия.
- Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
- Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
- Измените свойство 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
}