Каков наилучший способ отключить предупреждения, сгенерированные с помощью _CRT_SECURE_NO_DEPRECATE
, что позволяет им легко восстанавливаться и будет работать в версиях Visual Studio?
Отключение предупреждений, генерируемых через _CRT_SECURE_NO_DEPRECATE
Ответ 1
Если вы не хотите загрязнять исходный код (после того, как все это предупреждение представлено только компилятору Microsoft), добавьте символ _CRT_SECURE_NO_WARNINGS
к вашим настройкам проекта через "Проект" → "Свойства" → "Свойства конфигурации", → "C/С++" → "Препроцессор" → "Определения препроцессора".
Также вы можете определить его непосредственно перед включением файла заголовка, который генерирует это предупреждение. Вы должны добавить что-то вроде этого
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
И лишь небольшое замечание, убедитесь, что вы понимаете, что означает это предупреждение, и, возможно, если вы не собираетесь использовать другие компиляторы, кроме MSVC, подумайте над использованием более безопасной версии функций, т.е. strcpy_s вместо strcpy.
Ответ 2
Вы можете временно отключить предупреждения в тех местах, где они появляются с помощью
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
чтобы вы не отключили все предупреждения, которые могут быть вредными время от времени.
Ответ 3
Я работаю над проектом с несколькими платформами, поэтому я не могу использовать функцию _s, и я не хочу загрязнять свой код визуальным кодом для студии.
мое решение отключает предупреждение 4996 о проекте визуальной студии. перейдите в Project → Properties → Свойства конфигурации → C/С++ → Дополнительно → Отключите определенное предупреждение, добавьте значение 4996.
если вы используете также mfc и/или atl-библиотеку (а не мой случай), определите до включения mfc _AFX_SECURE_NO_DEPRECATE и перед включением atl _ATL_SECURE_NO_DEPRECATE.
Я использую это решение на Visual Studio 2003 и 2005.
p.s. если вы используете только визуальную студию, безопасные перегрузки шаблонов могут быть хорошим решением.
Ответ 4
Вы также можете использовать Secure Template Overloads, они помогут вам заменить незащищенные вызовы на безопасные в любом месте, где можно легко вывести размер буфера (статические массивы).
Просто добавьте следующее:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
Затем зафиксируйте остальные предупреждения вручную, используя функции _s.
Ответ 5
Комбинация ответов @[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
Ответ 6
Лучший способ сделать это - простая проверка и оценка. Обычно я делаю что-то вроде этого:
#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)
Еще не подвел меня; Надеюсь, что это поможет
Ответ 7
Для предупреждения по предупреждению, целесообразно восстановить его по умолчанию в какой-то момент, поскольку вы делаете это в каждом случае.
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
Ответ 8
вы можете отключить проверку безопасности. перейдите к
Проект → Свойства → Свойства конфигурации → C/С++ → Генерация кода → Проверка безопасности
и выберите Отключить проверку безопасности (/GS -)
Ответ 9
Вы можете определить символ _CRT_SECURE_NO_WARNINGS, чтобы отключить их, и отменить его, чтобы восстановить их.
Ответ 10
Еще один поздний ответ... Вот как 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 )
}