当 memcpy 应该足够时,为什么 wmemcpy 存在?

Why does wmemcpy exist when memcpy should suffice?

wmemcpy 似乎执行与 memcpy 相同的操作,但接受 wchar_t* 而不是 void*。如果这两个代码片段应该具有相同的行为,它的存在如何证明是合理的?它有什么用处吗?

memcpy(dest, wchar_array, sizeof(wchar_array));

wmemcpy(dest, wchar_array, sizeof(wchar_array) / sizeof(wchar_t));

我想这主要是关于 API 对称性,而且,它还允许更轻松地编写可以同时处理宽字符和普通字符串(由预处理器定义或类似方式切换)的代码。

本质上,如果您希望您的代码与 char 一起工作,您 #define 您的复制功能与 memcpy 一样。对于 wchar_t,您将其定义为 wmemcpy。您的大小参数只是字符数(charwchar_t);请记住,参数不一定是固定大小的数组,因此使用 sizeof 并不总是一个选项。

Win32 API 例如使用类似的策略:如果您定义 UNICODE 预处理器符号,大多数函数解析为它们的宽字符版本(以 W 为后缀),否则它们解析为 "narrow" 字符版本(后缀为 A); TCHAR 相应地定义为 charwchar_t;等。结果是您可以很容易地编写适用于宽字符或常规字符的代码。

当然,这绝不是必须的;但是,标准 C 库不一定是绝对最小的。你可能会争辩说 calloc 是多余的,因为你总是可以使用 malloc 然后 memset,例如;但是它仍然存在。

除了 davmac 关于 API 对称性和数组大小并不总是被授予的答案之外,应该强调的是 wmemcpy 的第三个参数指的是要复制的元素数(而不是字节)。

如果您使用 wchar_t 对象并使用 <wchar.h> 中的其他函数来处理它们,可能会有所帮助。 wcslen 例如 returns 以 wchar_t 元素表示的 C 宽字符串长度,以及 wcschrwcsrchr return wchar_t * ,因此使用它们进行一些指针运算也可以使您处于 "realm" 个元素数。

P.S。如果最小 wchar_t 数组的大小在您的示例中给出,则使用 wmemcpy 可能会产生比您使用的 sizeof(wchar_array) 更优雅的代码:

#define SIZE 40
wchar_t wchar_array[SIZE];
// ...
wmemcpy(dest, wchar_array, SIZE);