【问题标题】:"wcs" and "_w" and "_mbs" prefix in Visual StudioVisual Studio 中的“wcs”、“_w”和“_mbs”前缀
【发布时间】:2014-01-03 11:59:47
【问题描述】:

对于使用/不使用 wcs/_w/_mbs 前缀定义的函数的差异,我有点困惑。
例如:

  • fopen(),_wfopen()
    在 msdn 上给出的是:

fopen 函数打开由文件名指定的文件。 _wfopen 是 fopen 的宽字符版本; _wfopen 的参数是宽字符串。否则,_wfopen 和 fopen 行为 一样的。

我只是怀疑是否存在与添加“_w”前缀相关的窗口的平台依赖性。

  • strcpy(),wcscpy(),_mbscpy()
    在 msdn 上给出的是:

wcscpy 和 _mbscpy 分别是 strcpy 的宽字符和多字节字符版本。

再次怀疑添加“wcs”或“_mbs”是否取决于平台。

编辑

  • WideCharToMultiByte function 是否也依赖于平台?

WideCharToMultiByte 不是 C 运行时函数,它是 Windows API,因此它依赖于平台

  • 同样,wcstombs_s function 也依赖于平台?

它是非标准的,但在 C11 附录 K 中被标准化。

【问题讨论】:

  • 是的,它依赖于平台。
  • @OldProgrammer 只有_mbscpy 是。 wcscpy 是标准的。

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


【解决方案1】:

wcs* 函数(如 wcscpy)是 C 标准库的一部分。 _wfopen 函数和其他 _w* 函数是扩展,像 _mbscpy 这样的多字节字符串函数也是如此。

在大多数情况下,具有前导下划线的 Visual C++ C 运行时 (CRT) 函数是扩展;没有前导下划线的函数是 C 标准库的一部分。

有两个主要例外,扩展名可能没有前导下划线:

  • 有几个使用下划线前缀声明的扩展函数,它们具有无前缀别名以实现向后源代码兼容性。这些别名已弃用,如果您尝试使用它们,您将收到可抑制的弃用警告 (C4996)。

  • 对于某些 C 标准库函数,有 _s-suffixed 安全替代函数,例如scanf_s。这些是默认声明的,但可以通过将宏 __STDC_WANT_SECURE_LIB__ 定义为值为 0 来抑制它们的声明。

    (这些功能实际上是在可选附件 K 中添加到 C11 中的, 但请注意,指定的内容之间存在一些差异 在 C 标准中以及由 Visual C++ 实现的内容。这 差异是由于a historical accident。)

【讨论】:

  • 嗨,我刚刚对问题进行了小幅编辑,并添加了两个依赖于平台的函数。
  • wcstombs_s 属于我回答的第二个要点:它是非标准的,但在 C11 Annex K 中已标准化。我不知道该特定功能是否存在行为差异(我没有完成了对这些功能的一致性的全面分析)。 WideCharToMultiByte 不是 C 运行时函数,它是 Windows API,并且 100% 依赖于平台。对于遇到的每一个函数,你都会问同样的问题吗?
  • 谢谢您的回答,很抱歉给您带来麻烦。
  • 没问题,但我想知道您更广泛的目标是什么。你是否试图在你的代码中坚持使用标准的、可移植的 API(如果是的话,可移植到哪组系统)?有了有关您尝试做什么的更多信息,我或其他人可能能够提供更好的参考,以帮助您识别特定于平台的功能。
  • 是的,除了 windows 之外,我们确实需要跨 Mac、Solaris、Linux 的支持。所以是的,在所有这些平台上的可移植性将节省一些麻烦。
【解决方案2】:

wcscpy 是标准的。 _mbcscpy 特定于 MS VC。

这就是开头有下划线的原因:带前导下划线的名称保留用于特定于实现的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多