对于使用/不使用 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/