【问题标题】:Disabling Warnings generated via _CRT_SECURE_NO_DEPRECATE禁用通过 _CRT_SECURE_NO_DEPRECATE 生成的警告
【发布时间】:2010-09-12 06:50:56
【问题描述】:

禁用通过_CRT_SECURE_NO_DEPRECATE 生成的警告的最佳方法是什么,以便轻松恢复它们并适用于 Visual Studio 版本?

【问题讨论】:

    标签: c++ visual-studio visual-c++


    【解决方案1】:

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

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

    #ifdef _MSC_VER
    #define _CRT_SECURE_NO_WARNINGS
    #endif
    

    请注意,请确保您了解此警告的含义,如果您不打算使用 MSVC 以外的其他编译器,请考虑使用更安全的函数版本,即 strcpy_s 而不是 strcpy。

    【讨论】:

    • 对于 c11 和 c++ 11 规范,您应该在任何兼容的编译器中使用 _s 版本的字符串操作例程。
    • @PaulWhitehurst:不,它们仅在可选扩展中。
    【解决方案2】:

    您可以在警告出现的地方暂时禁用警告

    #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 suppress 有两个 p
    【解决方案3】:

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

    附言如果您仅使用 Visual Studio,则安全模板重载可能是一个很好的解决方案。

    【讨论】:

    • *_s 函数不是 Microsoft 特定的。它们被称为边界检查接口,它们是 C/C++ 标准的一部分。见ISO/IEC TR 24772。 Glibc 的人决定不实现它们。
    • "...而且我不想用 Visual Studio 特定代码污染我的代码" - 为什么不使用更安全的功能并避免安全漏洞?在 Unix 和 Linux 上,您可以提供一个包装器来执行您无论如何都应该执行的绑定检查,然后调用 Unix 或 Linux 的标准函数。 如果你没有执行边界检查,那么你真的需要这些函数来避免你的代码出现问题(至少在 Windows 上)。
    【解决方案4】:

    您也可以使用Secure Template Overloads,它们将帮助您在任何可以轻松推断缓冲区大小(静态数组)的地方用安全调用替换不安全调用。

    只需添加以下内容:

    #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 
    

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案6】:

        对于逐个警告的警告,明智的做法是在某个时候将其恢复为默认值,因为您是根据具体情况进行操作的。

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

        【讨论】:

          【解决方案7】:

          执行此操作的最佳方法是进行简单的检查和评估。我通常会这样做:

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

          还没有让我失望;希望这会有所帮助

          【讨论】:

            【解决方案8】:

            您可以禁用安全检查。去

            项目 -> 属性 -> 配置属性 -> C/C++ -> 代码生成 -> 安全检查

            并选择禁用安全检查 (/GS-)

            【讨论】:

              【解决方案9】:

              您可以定义 _CRT_SECURE_NO_WARNINGS 符号来抑制它们并取消定义它以恢复它们。

              【讨论】:

                【解决方案10】:

                另一个迟到的答案...这是 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 )
                } 
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-01-03
                  • 2015-08-01
                  • 2017-08-18
                  • 2020-05-18
                  • 1970-01-01
                  • 2011-02-09
                  • 2018-11-26
                  • 2013-01-27
                  相关资源
                  最近更新 更多