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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
75
0
160 031
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Ответ принят как подходящий

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

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

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

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

Со спецификациями c11 и C++ 11 вы должны использовать _s-версии подпрограмм обработки строк в любом совместимом компиляторе.

Paul Whitehurst 07.03.2014 18:04

@PaulWhitehurst: Нет, они есть только в дополнительных расширениях.

Deduplicator 05.05.2014 15:15

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

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

#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 решили не реализовывать их.

jww 30.09.2015 08:51

«... и я не хочу загрязнять свой код кодом, специфичным для Visual Studio» - Почему бы не использовать более безопасные функции и избежать ошибок безопасности? В Unix и Linux вы можете предоставить оболочку, которая выполняет проверку привязки, которую вы все равно должны делать, а затем вызывать стандартную функцию Unix или Linux. Если вы не выполняете проверку границ, тогда вы действительно необходимость этих функций, чтобы избежать проблем с вашим кодом (по крайней мере, в Windows).

jww 01.11.2015 03:37

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

#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 14.04.2015 18:07

@cremno suppress с двумя p

Gunther Struyf 11.04.2016 12:40

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

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

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