为什么C/C++很多内部函数由下划线开头?关于VS中的CRT_SECURE

以下摘自compatibility


兼容性
通用 C运行时库 (UCRT) 支持实现 C++ 一致性所需的大多数 C 标准库。 它实现 C99 (ISO/IEC 9899:1999)库,但有一些例外情况:在 <th.>中定义的类型泛型宏,以及 <complex >中严格的类型兼容性。 UCRT 还实现了 POSIX (ISO/IEC 9945-1:1996,POSIX 系统应用程序编程接口) C 库的大型子集。 但是,它并不完全符合任何特定的 POSIX 标准。 UCRT 还实现了几个特定于 Microsoft 的函数和不属于标准的宏。

在 vcruntime`库中找到了特定于 Visual C++ 的 Microsoft 实现的函数。 其中的许多函数都供内部使用,用户代码无法调用这些函数。 记录了一些函数,以供调试和实现兼容性时使用。

C++ 标准将全局命名空间中以下划线开头的名称保留到实现中。 POSIX 函数和 Microsoft 特定的运行时库函数都在全局命名空间中,但不属于标准 C 运行时库。 这就是为什么这些函数的首选 Microsoft 实现具有前导下划线的原因。 为了便于移植,UCRT 还支持默认名称,但使用它们编译代码时,Microsoft C++ 编译器会发出弃用警告。 只会弃用默认名称,而不会弃用函数本身。 若要取消警告,在使用原始 POSIX 名称的代码中包含任何标头之前,请定义 _CRT_NONSTDC_NO_WARNINGS

由于误用参数和未检查缓冲区,标准 C 库中的某些函数具有不安全的使用情况历史记录。 这些函数通常是代码中出现的安全问题的来源。 Microsoft 创建了这些函数的一组更加安全的版本来验证参数用法。 当在运行时检测到问题时,它们将调用无效参数处理程序。 默认情况下,如果使用的函数具有更加安全的变体,Microsoft C++ 编译器会发出弃用警告。 将代码编译为C++时,可以将 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 定义为1,以消除大多数警告。 此宏允许模板重载调用更安全的变体,同时保持可移植的源代码。 若要取消警告,在使用这些函数的代码中包含任何标头之前,请定义 _CRT_SECURE_NO_WARNINGS。 有关详细信息,请参阅 Security Features in the CRT

除非文档中对特定函数另有注明,否则 UCRT 与 Windows API 可兼容。 Windows 应用商店或通用 Windows 平台(UWP)应用中不支持某些功能。 通用 Windows 平台应用中不支持的 CRT 函数中列出了这些函数。


答案显而易见,而且还有意外收获,终于知道为什么VS中不让用 scanf 等“旧函数”了 : CRT 中的安全功能

许多旧 CRT 函数具有更新、更安全的版本。 如果存在安全函数,则较旧的、安全性更低的版本将标记为已弃用,并且新版本具有_s(“安全”)后缀。
在此上下文中,“已弃用”仅表示不建议使用某个函数;而不表示计划从 CRT 中删除此函数。

安全函数不阻止或纠正安全性错误,而是在出现错误时捕获错误。 它们对错误条件进行附加检查,如果出现错误,它们将调用错误处理程序(请参阅参数验证)。

例如,strcpy 函数无法指明它所复制的字符串对于目标缓冲区是否太大。 但是,它的安全匹配项 strcpy_s 可将缓冲区大小作为参数,以便确定是否将发生缓冲区溢出。 如果您使用 strcpy_s 将 11 个字符复制到 10 字符缓冲区中,那么就是您做错了;strcpy_s 无法纠正您的错误,但它可检测到您的错误,并通过调用无效参数处理程序来告知您此情况。

消除弃用警告
可通过多种方式消除针对较旧的、安全性更低的函数的弃用警告。 最简单的方法是定义 _CRT_SECURE_NO_WARNINGS或使用警告杂注。 这将禁用弃用警告,但导致出现警告的安全问题仍存在。 更佳的做法是,将弃用警告保持启用状态并利用新的 CRT 安全功能。

在 C++ 中,执行此操作的最简单方法是使用安全模板重载,在许多情况下,它会通过将对已弃用函数的调用替换为对这些函数的新安全版本的调用来消除弃用警告。 例如,考虑此对 strcpy 的已弃用调用:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 定义为 1 可通过将 strcpy 调用更改为 strcpy_s(这将阻止缓冲区溢出)来消除警告。 有关详细信息,请参阅 Secure Template Overloads

对于那些不带安全模板重载的已弃用的函数,你应考虑手动更新代码以使用安全版本。

弃用警告的另一个源(与安全性无关)为 POSIX 函数。 将 POSIX 函数名称替换为它们的标准等效项(例如,将 access 更改为_access),或通过定义 _CRT_NONSTDC_NO_WARNINGS 来禁用与 POSIX 相关的弃用警告。 有关详细信息,请参阅 兼容性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值