禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告

grr*_*sel 72 c++ visual-studio visual-c++

禁用生成的警告的最佳方法是什么_CRT_SECURE_NO_DEPRECATE,这样可以轻松恢复它们并且可以跨Visual Studio版本工作?

Ser*_*rge 103

如果您不想污染源代码(在所有此警告仅出现在Microsoft编译器之后),_CRT_SECURE_NO_WARNINGS请通过"项目" - >"属性" - >"配置属性" - >"C/C++" 将符号添加到项目设置中" - >"预处理器" - >"预处理器定义".

您也可以在包含生成此警告的头文件之前定义它.你应该添加这样的东西

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Run Code Online (Sandbox Code Playgroud)

只是一个小小的评论,请确保您了解此警告代表什么,也许,如果您不打算使用其他编译器而不是MSVC,请考虑使用更安全的函数版本,即strcpy_s而不是strcpy.

  • @PaulWhitehurst:不,他们只是在可选扩展中. (10认同)

mac*_*die 47

您可以使用在页面出现的位置临时禁用警告

#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
Run Code Online (Sandbox Code Playgroud)

所以你不要禁用所有警告,这有时可能是有害的.

  • 正是我需要的 (13认同)
  • `#pragma warning(supress: warning-code)` 如果只有一个(以下)行使用不推荐使用的函数。 (2认同)
  • @cremno `suppress` 带有两个 p (2认同)

小智 8

我在一个多平台项目上工作,所以我不能使用_s函数,我不想用Visual Studio特定代码污染我的代码.
我的解决方案是禁用visual studio项目上的警告4996.转到项目 - >属性 - >配置属性 - > C/C++ - >高级 - >禁用特定警告添加值4996.
如果您还使用mfc和/或atl库(不是我的情况)定义之前包含mfc _AFX_SECURE_NO_DEPRECATE和之前包括atl _ATL_SECURE_NO_DEPRECATE.
我在visual studio 2003和2005中使用这个解决方案.

ps如果你只使用visual studio,安全模板重载可能是一个很好的解决方案.

  • `*_s`函数不是Microsoft特有的.它们被称为Bounds Checking接口,它们是C/C++标准的一部分.见[ISO/IEC TR 24772](http://www.iso.org/iso/catalogue_detail.htm?csnumber=41542).Glibc人决定不实施它们. (2认同)

Dre*_*mer 6

您还可以使用安全模板重载,它们将帮助您在任何可以轻松推断缓冲区大小(静态数组)的地方用安全模块替换不安全的调用.

只需添加以下内容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 
Run Code Online (Sandbox Code Playgroud)

然后使用_s函数手动修复剩余的警告.


Pic*_*tor 5

结合@ [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
Run Code Online (Sandbox Code Playgroud)