[英]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
。 你的size参数只是字符数( char
或wchar_t
); 请记住,参数不一定是固定大小的数组,因此使用sizeof
并不总是一个选项。
例如,Win32 API使用类似的策略:如果定义UNICODE
预处理器符号,大多数函数将解析为其宽字符版本(后缀为W),否则它们将解析为“窄”字符版本(后缀为A) ; TCHAR
定义为char
或wchar_t
; 结果就是你可以很容易地编写适用于宽字符或常规字符的代码。
当然,这绝不是必要的 ; 但是,标准C库不一定是绝对最小的。 你可以说calloc
是多余的,因为你总是可以使用malloc
然后使用memset
; 然而,它仍然存在。
除了davmac关于API对称性的答案并且不总是授予数组的大小之外,应该强调的是wmemcpy
的第三个参数是wmemcpy
复制的元素的数量(而不是字节)。
如果您使用wchar_t
对象并使用<wchar.h>
其他函数处理它们,则可能会<wchar.h>
帮助。 例如, wcslen
根据wchar_t
元素返回C宽字符串长度,而wcschr
和wcsrchr
返回wchar_t *
,因此使用它们进行一些指针算法也可以使您保持在元素数的“范围”。
PS如果在您的示例中暗示了最小wchar_t
数组的大小,则使用wmemcpy
可能会产生比您使用的sizeof(wchar_array)
更优雅的代码:
#define SIZE 40
wchar_t wchar_array[SIZE];
// ...
wmemcpy(dest, wchar_array, SIZE);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.