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





Вы можете определить символ _CRT_SECURE_NO_WARNINGS, чтобы подавить их, и отменить его, чтобы восстановить их обратно.
Если вы не хотите загрязнять исходный код (ведь это предупреждение отображается только для компилятора Microsoft), добавьте символ _CRT_SECURE_NO_WARNINGS в настройки вашего проекта через «Проект» -> «Свойства» -> «Свойства конфигурации» -> «C / C++ »->« Препроцессор »->« Определения препроцессора ».
Также вы можете определить его непосредственно перед включением файла заголовка, который генерирует это предупреждение. Вы должны добавить что-то вроде этого
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
И небольшое замечание: убедитесь, что вы понимаете, что означает это предупреждение, и, возможно, если вы не собираетесь использовать другие компиляторы, кроме MSVC, подумайте об использовании более безопасной версии функций, то есть strcpy_s вместо strcpy.
@PaulWhitehurst: Нет, они есть только в дополнительных расширениях.
Вы также можете использовать Безопасные перегрузки шаблонов, они помогут вам заменить незащищенные вызовы безопасными в любом месте, где можно легко определить размер буфера (статические массивы).
Просто добавьте следующее:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
Затем вручную исправьте оставшиеся предупреждения с помощью функций _s.
Я работаю над многоплатформенным проектом, поэтому я не могу использовать функцию _s и не хочу загрязнять свой код кодом, специфичным для Visual Studio.
Мое решение - отключить предупреждение 4996 в проекте Visual Studio. перейдите в Project -> Properties -> Configuration properties -> C / C++ -> Advanced -> Disable specific warning добавьте значение 4996.
если вы также используете библиотеку mfc и / или atl (не мой случай), определите перед include mfc _AFX_SECURE_NO_DEPRECATE и перед include atl _ATL_SECURE_NO_DEPRECATE.
Я использую это решение в Visual Studio 2003 и 2005.
p.s. если вы используете только визуальную студию, безопасные перегрузки шаблонов могут быть хорошим решением.
Функции *_s не относятся к Microsoft. Они известны как интерфейсы проверки границ и являются частью стандарта C / C++. См. ISO / IEC TR 24772. Ребята из Glibc решили не реализовывать их.
«... и я не хочу загрязнять свой код кодом, специфичным для Visual Studio» - Почему бы не использовать более безопасные функции и избежать ошибок безопасности? В Unix и Linux вы можете предоставить оболочку, которая выполняет проверку привязки, которую вы все равно должны делать, а затем вызывать стандартную функцию Unix или Linux. Если вы не выполняете проверку границ, тогда вы действительно необходимость этих функций, чтобы избежать проблем с вашим кодом (по крайней мере, в Windows).
Вы можете временно отключить предупреждения в тех местах, где они появляются, используя
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
поэтому вы не отключаете все предупреждения, которые временами могут быть опасными.
#pragma warning(supress: warning-code), если только одна (следующая) строка использует устаревшую функцию.
@cremno suppress с двумя p
Лучший способ сделать это - просто проверить и оценить. Обычно я делаю что-то вроде этого:
#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)
Еще не подвел меня; Надеюсь это поможет
Для случая предупреждения через предупреждение, разумно в какой-то момент восстановить его до значения по умолчанию, поскольку вы делаете это в каждом конкретном случае.
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
Комбинация ответов @ [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
вы можете отключить проверку безопасности. перейти к
Проект -> Свойства -> Свойства конфигурации -> C / C++ -> Генерация кода -> Проверка безопасности
и выберите Отключить проверку безопасности (/ GS-)
Еще один поздний ответ ... Вот как 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 )
}
Со спецификациями c11 и C++ 11 вы должны использовать _s-версии подпрограмм обработки строк в любом совместимом компиляторе.