禁用通過_CRT_SECURE_NO_DEPRECATE
生成的警告的最佳方式是什麼,可以輕鬆恢復它們並適用於Visual Studio版本?通過_CRT_SECURE_NO_DEPRECATE生成的禁用警告
回答
如果你不想污染你的源代碼(畢竟這個警告只出現在Microsoft編譯器中),通過「項目」 - >「屬性」 - >「配置屬性」將_CRT_SECURE_NO_WARNINGS
符號添加到你的項目設置中 - >「C/C++」 - >「預處理器」 - >「預處理器定義」。
您還可以在包含生成此警告的頭文件之前對其進行定義。 您應該添加這樣的事情
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
而只是一個小的話,一定要明白這是什麼警告表示,也許,如果你不打算使用其他的編譯器比MSVC,請考慮使用更安全版本的功能,即strcpy_s而不是strcpy。
您可以定義_CRT_SECURE_NO_WARNINGS符號以禁止它們,並取消定義它以將其恢復。
您還可以使用Secure Template Overloads,他們會幫你更換安全的人的不安全調用的任何地方,可以很容易地推斷出緩衝區的大小(靜態數組)。
只需添加以下內容:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
然後用手解決剩餘的警告,使用_s功能。
我工作在一個多平臺的項目,所以我不能使用_s函數,我不想污染我的代碼與視覺工作室特定的代碼。
我的解決方法是禁用visual studio項目的警告4996。轉到項目 - >屬性 - >配置屬性 - > C/C++ - >高級 - >禁用特定警告添加值4996.
如果您還使用mfc和/或atl庫(不是我的情況)define include include mfc _AFX_SECURE_NO_DEPRECATE和包含atl _ATL_SECURE_NO_DEPRECATE之前。
我在Visual Studio 2003和2005中使用此解決方案。
ps.s.如果只使用visual studio,那麼安全模板重載可能是一個很好的解決方案。
`* _s`函數不是Microsoft特定的。它們被稱爲邊界檢查接口,它們是C/C++標準的一部分。參見[ISO/IEC TR 24772](http://www.iso.org/iso/catalogue_detail.htm?csnumber=41542)。 Glibc人決定不實施它們。 – jww 2015-09-30 05:51:31
,他們似乎利用
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
所以您不要禁用所有警告,這有時可能危害您可以暫時禁用警告的地方。
做到這一點的最好方法是通過簡單的檢查和評估。我平時做這樣的事情:
#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
中使用它的方式。請注意,他們也禁止Warning 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)
}
- 1. 禁用java ant生成的警告
- 2. Xcode警告 - 無法生成警告
- 3. 禁用關於生成的HTML的Eclipse警告?
- 4. 禁用ACL2中的跳過警告警告
- 5. 禁用Eclipse自動生成文件夾的警告
- 6. 如何僅禁用生成文件的「警告爲錯誤」? (MSBuild)
- 7. 禁用IntelliJ警告
- 8. 禁用PHP警告
- 9. 禁用警告2008
- 10. IntelliJ禁用警告
- 11. 如何禁止此COM通用警告?
- 12. webpack2 | postcss生成警告
- 13. 解決生成警告 -
- 14. 禁用Encode.pm的警告
- 15. 通過頭文件在GCC中禁用警告消息?
- 16. 通過MS Outlook發送電子郵件並禁用警告
- 17. xcode7禁用棄用警告
- 18. 生成自動裝箱使用警告
- 19. 警告通過版本2.0.1
- 20. 在VIM中禁用警告?
- 21. 警告:EXEC()已禁用
- 22. 禁用所有gcc警告
- 23. 禁用Interop excel警告vb.net
- 24. 如何禁用#pragma警告?
- 25. 禁用所有scons警告
- 26. 禁用綁定警告
- 27. 如何禁用keras警告?
- 28. 禁用覆蓋警告C++
- 29. 賽靈思:通用合成警告
- 30. PHP的filter_var()函數生成警告
隨着C11和C++ 11級的規格,你應該使用字符串操作例程的_s版本,在任何兼容的編譯器。 – 2014-03-07 14:04:37
@PaulWhitehurst:不,他們只是在可選的擴展。 – Deduplicator 2014-05-05 11:15:39