Отключение предупреждений, генерируемых через _CRT_SECURE_NO_DEPRECATE

StackOverflow https://stackoverflow.com/questions/119578

  •  02-07-2019
  •  | 
  •  

Вопрос

Каков наилучший способ отключить предупреждения, генерируемые через _CRT_SECURE_NO_DEPRECATE это позволяет легко их восстановить и будет работать во всех версиях Visual Studio?

Это было полезно?

Решение

Если вы не хотите загрязнять исходный код (ведь это предупреждение появляется только в компиляторе Microsoft), добавьте _CRT_SECURE_NO_WARNINGS в настройки вашего проекта через «Проект» -> «Свойства» -> «Свойства конфигурации» -> «C/C++» -> «Препроцессор» -> «Определения препроцессора».

Также вы можете определить его непосредственно перед включением файла заголовка, который генерирует это предупреждение.Вам следует добавить что-то вроде этого

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

И небольшое замечание: убедитесь, что вы понимаете, что означает это предупреждение, и, возможно, если вы не собираетесь использовать другие компиляторы, кроме MSVC, рассмотрите возможность использования более безопасной версии функций, т.е.strcpy_s вместо strcpy.

Другие советы

Вы можете временно отключить предупреждения в тех местах, где они появляются, используя

#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)

поэтому вы не отключите все предупреждения, которые иногда могут быть вредными.

Я работаю над многоплатформенным проектом, поэтому не могу использовать функцию _s и не хочу загрязнять свой код кодом, специфичным для Visual Studio.
мое решение — отключить предупреждение 4996 в проекте Visual Studio.перейдите в Проект -> Свойства -> Свойства конфигурации -> C/C++ -> Дополнительно -> Отключить конкретное предупреждение, добавьте значение 4996.
если вы также используете библиотеку mfc и/или atl (не в моем случае), определите перед включением mfc _AFX_SECURE_NO_DEPRECATE и перед включением atl _ATL_SECURE_NO_DEPRECATE.
я использую это решение в Visual Studio 2003 и 2005.

п.с.если вы используете только Visual Studio, безопасные перегрузки шаблонов могут быть хорошим решением.

Вы также можете использовать Безопасные перегрузки шаблонов, они помогут вам заменить незащищенные вызовы безопасными везде, где можно легко определить размер буфера (статические массивы).

Просто добавьте следующее:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

Затем исправьте оставшиеся предупреждения вручную, используя функции _s.

Комбинация ответа @[macbirdie] и @[Adrian Borchardt].Что оказывается очень полезным в производственной среде (не портит ранее существовавшее предупреждение, особенно во время кроссплатформенной компиляции).

#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(push)
#pragma warning(disable: 4996) // Disable deprecation
#endif 
//...                          // ...
strcat(base, cat);             // Sample depreciated code
//...                          // ...
#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(pop)           // Renable previous depreciations
#endif

В случае предупреждения за предупреждением разумно в какой-то момент восстановить настройки по умолчанию, поскольку вы делаете это в каждом конкретном случае.

#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */

Лучший способ сделать это – простая проверка и оценка.Обычно я делаю что-то вроде этого:

#ifndef _DEPRECATION_DISABLE   /* One time only */
#define _DEPRECATION_DISABLE   /* Disable deprecation true */
#if (_MSC_VER >= 1400)         /* Check version */
#pragma warning(disable: 4996) /* Disable deprecation */
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */
#endif /* #ifndef _DEPRECATION_DISABLE */

Все, что действительно требуется, это следующее:

#pragma warning(disable: 4996)

Меня еще не подвел;Надеюсь это поможет

вы можете отключить проверку безопасности.идти к

Проект -> Свойства -> Свойства конфигурации -> C/C++ -> Генерация кода -> Проверка безопасности

и выберите «Отключить проверку безопасности» (/GS-).

Вы можете определить символ _CRT_SECURE_NO_WARNINGS, чтобы подавить их, и отменить его определение, чтобы восстановить их обратно.

Еще один поздний ответ...Вот как Microsoft использует его в своих wchar.h.Обратите внимание, что они также отключают Предупреждение C6386:

__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N)
{
    #pragma warning( push )
    #pragma warning( disable : 4996 6386 )
        return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
    #pragma warning( pop )
} 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top