2008-09-23 147 views

回答

100

如果你不想污染你的源代碼(畢竟這個警告只出現在Microsoft編譯器中),通過「項目」 - >「屬性」 - >「配置屬性」將_CRT_SECURE_NO_WARNINGS符號添加到你的項目設置中 - >「C/C++」 - >「預處理器」 - >「預處理器定義」。

您還可以在包含生成此警告的頭文件之前對其進行定義。 您應該添加這樣的事情

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 

而只是一個小的話,一定要明白這是什麼警告表示,也許,如果你不打算使用其他的編譯器比MSVC,請考慮使用更安全版本的功能,即strcpy_s而不是strcpy。

+0

隨着C11和C++ 11級的規格,你應該使用字符串操作例程的_s版本,在任何兼容的編譯器。 – 2014-03-07 14:04:37

+9

@PaulWhitehurst:不,他們只是在可選的擴展。 – Deduplicator 2014-05-05 11:15:39

1

您可以定義_CRT_SECURE_NO_WARNINGS符號以禁止它們,並取消定義它以將其恢復。

6

您還可以使用Secure Template Overloads,他們會幫你更換安全的人的不安全調用的任何地方,可以很容易地推斷出緩衝區的大小(靜態數組)。

只需添加以下內容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

然後用手解決剩餘的警告,使用_s功能。

8

我工作在一個多平臺的項目,所以我不能使用_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,那麼安全模板重載可能是一個很好的解決方案。

+2

`* _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

41

,他們似乎利用

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

所以您不要禁用所有警告,這有時可能危害您可以暫時禁用警告的地方。

2

做到這一點的最好方法是通過簡單的檢查和評估。我平時做這樣的事情:

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

沒有失敗我呢;希望通過警告的情況下這有助於

2

的提醒,這是明智的恢復它在某一點違約,因爲你是逐個做它的情況下。

#pragma warning(disable: 4996) /* Disable deprecation */ 
// Code that causes it goes here 
#pragma warning(default: 4996) /* Restore default */ 
4

@ [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 
2

您可以禁用安全檢查。去

項目 - >屬性 - >配置屬性 - > C/C++ - >代碼生成 - >安全檢查

,並選擇禁用安全檢查(/ GS-)

0

另一個遲到的回答..以下是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) 
}