0

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

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

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

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

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

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

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

编辑

  • WideCharToMultiByte 函数是否也依赖于平台?

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

  • 同样wcstombs_s 函数也依赖于平台吗?

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

4

2 回答 2

7

类似的wcs*函数wcscpy是 C 标准库的一部分。该_wfopen函数和其他_w*函数是扩展,多字节字符串函数(如_mbscpy.

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

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

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

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

    (这些功能实际上是在可选附件 K 中添加到 C11 中的,但请注意,C 标准中指定的内容与 Visual C++ 实现的内容之间存在一些差异。差异是由于历史事故造成的。)

于 2013-12-16T07:11:12.310 回答
2

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

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

于 2013-12-16T07:09:45.547 回答