Отключение предупреждений, генерируемых с помощью _CRT_SECURE_NO_DEPRECATE - PullRequest
71 голосов
/ 23 сентября 2008

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

Ответы [ 10 ]

103 голосов
/ 23 сентября 2008

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

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

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

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

45 голосов
/ 23 сентября 2008

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

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

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

8 голосов
/ 23 сентября 2008

Я работаю над многоплатформенным проектом, поэтому не могу использовать функцию _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.

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

6 голосов
/ 23 сентября 2008

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

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

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

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

5 голосов
/ 13 июня 2013

Сочетание ответа @ [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
3 голосов
/ 09 января 2013

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

#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
2 голосов
/ 17 декабря 2014

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

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

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

2 голосов
/ 01 января 2013

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

#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)

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

1 голос
/ 23 сентября 2008

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

0 голосов
/ 30 сентября 2015

Еще один поздний ответ ... Вот как 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 )
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...