c++ - Visual Studio 中的 "wcs"和 "_w"和 "_mbs"前缀

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

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

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

The fopen function opens the file that is specified by filename. _wfopen is a wide-character version of fopen; the arguments to _wfopen are wide-character strings. Otherwise, _wfopen and fopen behave identically.

我只是怀疑添加“_w”前缀是否对 Windows 有任何平台依赖性。

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

wcscpy and _mbscpy are, respectively, wide-character and multibyte-character versions of strcpy.

再次怀疑“wcs”或“_mbs”的添加是否依赖于平台。

编辑:

  • WideCharToMultiByte function也依赖于平台?

WideCharToMultiByte is not a C Runtime function, it's a Windows API,hence it is platform dependent

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

It was nonstandard but was standardized in C11 Annex K.

最佳答案

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

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

有两个主要的异常(exception),其中扩展名可能没有前导下划线:

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

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

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

关于c++ - Visual Studio 中的 "wcs"和 "_w"和 "_mbs"前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20605094/

相关文章:

c++ - 通过 boost regex 替换行与相对复杂的 regex 的 boost

c++ - cairo_show_text 内存泄漏

visual-studio - 使用 SCP/SFTP 的 Visual Studio 发布网站

c++ - 为什么旧编译器构建的某些库可以链接到现代代码,而其他库则不能?

python-3.x - 在 Windows 10 上安装 Microsoft Visual C++ 10/SDK 7.1(适用于需要 VC++ 10 的 Python 包)

c++ - 非静态成员函数的 std::add_pointer 实现

c++ - 在父类型声明中使用子类型

visual-studio - 从 Visual Studio 迁移到 Eclipse 的指南

c - MSVC 有类似 __builtin_va_arg_pack 的东西吗?

c++ - 如何解决 Direct3DCreate9 的 LNK2019?