Кто разобрался что требует компилятор visual studio 2019? Предупреждение C4668
Предупреждение C4668 "STDC_WANT_SECURE_LIB" не задано как макроопределение препроцессора, замена на "0" для "#if/#elif"
в справочнике написано: Предупреждение компилятора (уровень 4) C4668 "символ" не определен в качестве макроса препроцессора и будет заменен в "директивах" на "0" Символ, который не был определен, использовался с директивой препроцессора. Символ будет иметь значение false. Чтобы определить символ, можно использовать либо директиву #define , либо параметр компилятора /d . Это предупреждение отключено по умолчанию. Подробнее: Выключенные по умолчанию предупреждения компилятора .
Вопрос не в том как это игнорировать а как это исправить
#include <iostream>
int main()
{
return 0;
}
Предупреждение C4668 "STDC_WANT_SECURE_LIB" не задано как макроопределение препроцессора, замена на "0" для "#if/#elif"
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2220 следующее предупреждение рассматривается как ошибка Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\limits.h 70
Предупреждение C4668 "STDC_WANT_SECURE_LIB" не задано как макроопределение препроцессора, замена на "0" для "#if/#elif" Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\limits.h 70
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\xmemory 162
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\xmemory 172
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\atomic 292
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\atomic 308
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\atomic 325
Предупреждение C4365 аргумент: преобразование "long" в "unsigned int", несоответствие типов со знаком и без Proverka C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\atomic 388
Ответы (3 шт):
Поскольку эти предупреждения появляются в стандартных заголовочных файлах, могу порекомендовать только отключать предупреждения на время компиляции стандартных заголовочных файлов. Что-то типа
#pragma warning(push,3)
#include <iostream>
#include <map>
#include <string>
#include <vector>
#pragma warning(pop)
#define lstrcat
//using namespace std;
char* string_index(int d)
Вот как компилируется ваш код:
Похоже, что выставление /Wall в IDE перешибает всё :), так что могу посоветовать все эти конкретные предупреждения отключать в
свойствах проекта -> дополнительно -> отключить указанные предупреждения
Но это плохо тем, что эти предупреждения будут отключены и для вашего кода.
Крайне рекомендую просто выставить уровень /W4 — на мой взгляд, этого вполне достаточно.
Собственно проблема заключается в некорректной проверке наличия макроса __STDC_WANT_SECURE_LIB__ в файле "limits.h"
#if __STDC_WANT_SECURE_LIB__
#ifndef RSIZE_MAX
#define RSIZE_MAX (SIZE_MAX >> 1)
#endif
#endif
Форма #if ИМЯ_МАКРОСА требует, чтобы макрос уже был определен как целочисленная константа. А если он может быть и совсем не определен, то следует предварительно проверить #ifdef ИМЯ_МАКРОСА. Если заголовочный файл включается, когда макрос не определен, то срабатывает резервный механизм, Учитывая, что все предыдущие проверки в этом файле были корректные, это явно баг в стандартном заголовочном файле. На этот счет следует отправить баг репорт:
https://docs.microsoft.com/en-us/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2022
А что же делать прямо сейчас, пока они там будут фиксить баг?
Ну во-первых можно отредактировать проблемный заголовочный файл:
#ifdef __STDC_WANT_SECURE_LIB__
Однако редактирование этого файла требует привилегий администратора не избавит от проблемы, когда код будет собираться на другой машине. Вместо этого можно у себя в коде включать первым заголовочный файл #include <cstdlib>, который определяет #define __STDC_WANT_SECURE_LIB__ 1. На самом деле у них там проблема еще и в том, что файл конфигурации CRT не включается в "limits.h" перед всеми этими проверками, приводя к некорректной конфигурации.


