Кто разобрался что требует компилятор 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 шт):

Автор решения: Harry

Поскольку эти предупреждения появляются в стандартных заголовочных файлах, могу порекомендовать только отключать предупреждения на время компиляции стандартных заголовочных файлов. Что-то типа

#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 — на мой взгляд, этого вполне достаточно.

→ Ссылка
Автор решения: 110010100

имг У меня вот так получается, для примера скрин вот она строка 70! введите сюда описание изображения

→ Ссылка
Автор решения: user7860670

Собственно проблема заключается в некорректной проверке наличия макроса __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" перед всеми этими проверками, приводя к некорректной конфигурации.

→ Ссылка