当 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
。您的大小参数只是字符数(char
或 wchar_t
);请记住,参数不一定是固定大小的数组,因此使用 sizeof
并不总是一个选项。
Win32 API 例如使用类似的策略:如果您定义 UNICODE
预处理器符号,大多数函数解析为它们的宽字符版本(以 W 为后缀),否则它们解析为 "narrow" 字符版本(后缀为 A); TCHAR
相应地定义为 char
或 wchar_t
;等。结果是您可以很容易地编写适用于宽字符或常规字符的代码。
当然,这绝不是必须的;但是,标准 C 库不一定是绝对最小的。你可能会争辩说 calloc
是多余的,因为你总是可以使用 malloc
然后 memset
,例如;但是它仍然存在。
除了 davmac 关于 API 对称性和数组大小并不总是被授予的答案之外,应该强调的是 wmemcpy
的第三个参数指的是要复制的元素数(而不是字节)。
如果您使用 wchar_t
对象并使用 <wchar.h>
中的其他函数来处理它们,可能会有所帮助。 wcslen
例如 returns 以 wchar_t
元素表示的 C 宽字符串长度,以及 wcschr
和 wcsrchr
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);
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
。您的大小参数只是字符数(char
或 wchar_t
);请记住,参数不一定是固定大小的数组,因此使用 sizeof
并不总是一个选项。
Win32 API 例如使用类似的策略:如果您定义 UNICODE
预处理器符号,大多数函数解析为它们的宽字符版本(以 W 为后缀),否则它们解析为 "narrow" 字符版本(后缀为 A); TCHAR
相应地定义为 char
或 wchar_t
;等。结果是您可以很容易地编写适用于宽字符或常规字符的代码。
当然,这绝不是必须的;但是,标准 C 库不一定是绝对最小的。你可能会争辩说 calloc
是多余的,因为你总是可以使用 malloc
然后 memset
,例如;但是它仍然存在。
除了 davmac 关于 API 对称性和数组大小并不总是被授予的答案之外,应该强调的是 wmemcpy
的第三个参数指的是要复制的元素数(而不是字节)。
如果您使用 wchar_t
对象并使用 <wchar.h>
中的其他函数来处理它们,可能会有所帮助。 wcslen
例如 returns 以 wchar_t
元素表示的 C 宽字符串长度,以及 wcschr
和 wcsrchr
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);