تعطيل التحذيرات التي تم إنشاؤها عبر _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 ولا أريد تلويث الكود الخاص بي باستخدام كود خاص بالاستوديو المرئي.
الحل الخاص بي هو تعطيل التحذير 4996 في مشروع الاستوديو المرئي.انتقل إلى المشروع -> الخصائص -> خصائص التكوين -> C/C++ -> خيارات متقدمة -> تعطيل تحذير محدد، أضف القيمة 4996.
إذا كنت تستخدم أيضًا مكتبة mfc و/أو atl (ليست حالتي) فحدد قبل تضمين mfc _AFX_SECURE_NO_DEPRECATE وقبل تضمين atl _ATL_SECURE_NO_DEPRECATE.
أستخدم هذا الحل عبر Visual Studio 2003 و 2005.

ملاحظة.إذا كنت تستخدم الاستوديو المرئي فقط، فقد يكون التحميل الزائد للقالب الآمن حلاً جيدًا.

يمكنك أيضًا استخدام تأمين التحميل الزائد للقالب, ، سيساعدونك على استبدال المكالمات غير الآمنة بأخرى آمنة في أي مكان يمكن فيه بسهولة استنتاج حجم المخزن المؤقت (المصفوفات الثابتة).

فقط أضف ما يلي:

#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