wmemcpy
似乎执行与memcpy
相同的操作,但接受wchar_t*
而不是void*
。如果这两个代码片段具有相同的行为,它的存在是否合理?它有用吗?
memcpy(dest, wchar_array, sizeof(wchar_array));
和
wmemcpy(dest, wchar_array, sizeof(wchar_array) / sizeof(wchar_t));
答案 0 :(得分:2)
我认为它主要是关于API对称性,但是,它允许更容易地编写可以使用宽字符和普通字符串(由预处理器定义或类似切换)的代码。
基本上,如果您希望代码与char
一起使用,则#define
您的副本功能为memcpy
。对于wchar_t
,您可以将其定义为wmemcpy
。您的大小参数只是字符数(char
或wchar_t
);请记住,参数不一定是固定大小的数组,因此使用sizeof
并不总是一个选项。
Win32 API实例使用了类似的策略:如果定义UNICODE
预处理器符号,大多数函数会解析为宽字符版本(后缀为W),否则它们将解析为&#34 ;窄"字符版本(以A为后缀); TCHAR
相应地定义为char
或wchar_t
;结果就是你可以很容易地编写适用于宽字或常规字符的代码。
当然,这绝不是必要;但是,标准的C库并不一定是绝对最小的。你可以说calloc
是多余的,因为你总是可以使用malloc
然后使用memset
;然而,它仍然存在。
答案 1 :(得分:1)
除了davmac关于API对称性的答案并且不总是授予数组的大小之外,应该强调的是wmemcpy
的第三个参数是指要复制的元素的数量(而不是字节)。 / p>
如果您使用wchar_t
个对象并使用<wchar.h>
中的其他功能处理它们,则可能会有所帮助。例如wcslen
以wchar_t
元素的形式返回C宽字符串长度,wcschr
和wcsrchr
返回wchar_t *
,因此使用它们来做一些指针算术也让你处于元素数量的“境界”。
P.S。如果您的示例中暗示了最小wchar_t
数组的大小,则使用wmemcpy
可能会产生比您使用的sizeof(wchar_array)
更优雅的代码:
#define SIZE 40
wchar_t wchar_array[SIZE];
// ...
wmemcpy(dest, wchar_array, SIZE);