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

时间:2016-04-07 21:18:26

标签: c memcpy

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为它主要是关于API对称性,但是,它允许更容易地编写可以使用宽字符和普通字符串(由预处理器定义或类似切换)的代码。

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

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

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

答案 1 :(得分:1)

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

如果您使用wchar_t个对象并使用<wchar.h>中的其他功能处理它们,则可能会有所帮助。例如wcslenwchar_t元素的形式返回C宽字符串长度,wcschrwcsrchr返回wchar_t *,因此使用它们来做一些指针算术也让你处于元素数量的“境界”。

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

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