需要 #define 来包含安全字符串函数的 Visual Studio 版本(以避免 _CRT_SECURE_NO_DEPRECATE)

2023-12-14

不久前,我尝试使用 Visual Studio 2010 编译一个 MFC 程序,该程序使用了我在 Visual Studio 2003 中编写的库。毫不奇怪,我收到了一堆关于弃用和使用各种字符串函数的安全版本的警告。

然后我更新了库中的相关函数以使用安全函数,并且它编译得很好。

后来我尝试在另一个系统上使用 Visual Studio 2003 再次编译它,但因为安全功能不存在而烦恼。

我决定创建一种混合方法,允许我编译在任一环境中使用该库的程序,如果可用,则使用安全函数,如果不可用,则将它们别名为旧函数。

起初,我考虑检查每个函数以查看是否存在安全版本,但这行不通,并且需要对每个函数进行单独的工作:

#ifndef strcpy_s
    #define strcpy_s(a,b,c) strcpy(a,c)
#endif

#ifndef strcat_s
    #define strcat_s(a,b,c) strcat(a,c)
#endif

…

所以我想找出一种方法来确定安全功能是否存在。我知道它们是在 Visual Studio 2005 中引入的,但是有吗#define或者可以如下使用的东西?

#ifndef SECURE_FUNCTIONS  // or #ifdef VS_VER_2005, #if (VS_VER >= 0x2005) etc.
    #define strcpy_s(a,b,c) strcpy(a,c)
    #define strcat_s(a,b,c) strcat(a,c)
    …
#endif

我检查了crtdefs.h但发现没有什么用处。


我找到了解决办法;这_MSC_VER宏/定义使这变得简单。自从安全字符串函数 were added in视觉工作室2005(VC++版本1400,那么做这样的事情就足够了:

#if _MSC_VER < 1400
    #define  _itoa_s(a,b,c)             _itoa(a,b,c)
    #define  wcscpy_s(a,b,c)            wcscpy(a,c)
    #define  _tprintf_s                 _tprintf
    #define  _sntprintf_s(a,b,c,d,...)  _sntprintf(a,c,d,...)
    …
#endif

现在,当代码在 VS2005+ 下编译时,它将具有额外的安全性,而当在 VS2003- 上编译时,它仍然会在不修改的情况下编译,尽管没有额外的安全性。

这使得移植和更新变得更加容易,因为即使您还无法使用 VS2005+ 编译它们,您也可以更新库函数并在代码中使用安全字符串函数。这样,当您升级编译器时,您无需对库或代码进行任何更改即可获得好处。它还使得在旧版本和新版本的 Visual Studio 上同时处理相同的代码库变得更加容易(至少在某种程度上)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要 #define 来包含安全字符串函数的 Visual Studio 版本(以避免 _CRT_SECURE_NO_DEPRECATE) 的相关文章

随机推荐

  • Powershell 忽略通过 SessionStateProxy.SetVariable 传递的参数

    我有以下 Powershell 脚本 param String stepx Not Working echo stepx 然后 我尝试使用以下 C 将参数传递给该脚本 using Runspace space RunspaceFactory
  • jQuery Draggable 和溢出问题[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 当我从设置为溢出 滚动的容器 div 中拖动 div 时 出现了不良效果 我找到了其他人遇到问题的例子 但我无法找到解决方案 Pastebin 上的示例 发生的情况是滚动只是增加了 我可以
  • 意图自定义权限不起作用

    UPDATE 我迫在眉睫的问题按照我下面的回答得到了解决 我的环境 PC 设备 不允许在 DEBUG 版本中自定义权限 我确信几周前我能够正常运行 DEBUG 构建 因此描述了 间歇性 错误 UPDATE 2 代码在不同开发人员的机器上同步
  • 在Python中使用递归将整数转换为base-x系统

    我正在尝试编写一个递归代码 可以将数字转换为任何基本系统 例如 整数 10 转换为二进制将转换为 1010 到目前为止 我已经有了这个 但我的输出之间有 无 谁能帮我修改我的代码吗 def convert a b add a b if a
  • 如何在 U-SQL 中实现循环

    无需使用 C 即可在 U SQL 中实现循环 while for 如果没有 任何人都可以共享 c 语法来在 u sql 中实现循环 我正在提取从特定日期到某个日期的文件 但现在我通过手动写入文件路径来提取该文件 DROP VIEW IF E
  • 我想从 Windows MDI 子窗体中删除图标

    图标也存在同样的问题 我对你的回答感到满意 即 seticon 属性为 false 但我的窗体是 MDI 窗体的子窗体 那么这个问题仍然是图标未删除 你能帮助我吗 是的 这是 Windows MDI 实现的一个 功能 设计指南要求子窗体有一
  • 玩具图聚类中“ufactor”的解释

    我正在尝试通过 METIS 进行不平衡分区 我不需要每个簇中有相同数量的顶点 METIS 中默认这样做 我的图没有约束 它是一个无向未加权图 这是一个由 METIS 聚类的示例玩具图 没有ufactor范围 然后 我尝试用不同的ufacto
  • 如何在 Android 上的 ArrayList 中的每个元素末尾添加逗号

    在我的应用程序中我想使用这个Library用于表演ArrayList items 我来自服务器的 ArrayList genres Action Comedy Family 我为显示项目编写了以下代码 private String most
  • 如何在 C# 中将对象数组向上转换为另一种类型的对象数组?

    我想将对象数组向上转换为不同对象类型的不同数组 如下所示 对象 对象 假设它非空 CLassA newObjects 对象为 ClassA 假设 ClassA 的对象是有效的向上转型 除了单独向上转换每个元素之外 还有其他方法吗 As 这个
  • 如何使 django 表单验证动态化?

    我有一个表单需要有一个有效的 url 或一个有效的文件才能上传 class ResourceUpload ModelForm uploadedfile forms FileField file url address forms URLFi
  • 计算给定列中的增量差异

    我正在搜索网络和 stackoverflow 但没有找到答案 所以请帮助我 我仍在学习和阅读 但我还没有正确思考 没有 IF 和 FOR 循环来做事 我有表1 id date state on date year quantity 1 30
  • 在 VSCode 主题中自定义块引用颜色

    我在用诺德主题在 VScode 中 Markdown 文件中的块引号看起来像这样 非常难以辨认 如何更改文字背景 我已在 用户设置 中尝试了以下操作 但它不起作用 workbench colorCustomizations textBloc
  • C# Unicode 字符串输出

    我有一个将字符串转换为 Unicode 字符串的函数 private string UnicodeString string text return Encoding UTF8 GetString Encoding ASCII GetByt
  • C 问题 - 无法弄清楚如何将指针分配给列表的开头

    我有一个教授要我们做的简单作业 基本上是从文本文件中提取一些数字并加载到链接列表中 我不想谈太多细节 但我有一个基本问题 他为我们提供了这样的功能 INTLIST init intlist int n INTLIST lst lst INT
  • FXML 变量未绑定

    我的 FXML 注入出现问题 据我所知 我已经设置了我的程序 但似乎我遗漏了一些东西 我的代码如下 Main package application import javafx application Application import
  • .Net 将命名空间添加到 XML 文档作为默认值并带有前缀

    当使用 XMLSerializer 在 vb net 中创建类 oXML 的序列化 XML 字符串时 如下所示 Dim x As New Xml Serialization XmlSerializer oXML GetType urn oe
  • 如何为列设置列切换表小部件的默认值?

    我一直在研究 jQuery Mobile 的 Table Widget 有没有一种方法可以通过此小部件从表头名称设置列的显示隐藏状态 如果没有这样的方法 那么解决这个问题的最佳方案是什么 jQM 不提供盒子外面因此 你必须通过JS来解决这个
  • ASP.NET MVC 编辑操作中与 RowVersion 的并发

    我想为我们的问题跟踪应用程序做一个简单的编辑表单 为简单起见 HttpGet Edit 操作如下所示 Issues Edit 12 public ActionResult Edit int id var thisIssue edmx Iss
  • 在android中实现关键字

    在 Android 中我看到这样的代码 public class Now extends Activity implements View OnClickListener 这在java中合法吗 View OnClickListener 到底
  • 需要 #define 来包含安全字符串函数的 Visual Studio 版本(以避免 _CRT_SECURE_NO_DEPRECATE)

    不久前 我尝试使用 Visual Studio 2010 编译一个 MFC 程序 该程序使用了我在 Visual Studio 2003 中编写的库 毫不奇怪 我收到了一堆关于弃用和使用各种字符串函数的安全版本的警告 然后我更新了库中的相关