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

当memcpy应该足够时,为什么会存在wmemcpy?,c,memcpy,C,Memcpy,wmemcpy执行与memcpy相同的操作,但接受wchar\u t*而不是void*。如果这两个代码段应该具有相同的行为,那么它的存在是如何证明的?它有有用的用途吗 memcpy(dest, wchar_array, sizeof(wchar_array)); 及 我想这主要是关于API对称性的,但同时,它允许更容易地编写代码,既可以使用宽字符,也可以使用普通字符串(由预处理器转换) 本质上,如果您希望您的代码与char一起工作,您可以将复制函数定义为memcpy。对于wchar\u t,您

wmemcpy
执行与
memcpy
相同的操作,但接受
wchar\u t*
而不是
void*
。如果这两个代码段应该具有相同的行为,那么它的存在是如何证明的?它有有用的用途吗

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


我想这主要是关于API对称性的,但同时,它允许更容易地编写代码,既可以使用宽字符,也可以使用普通字符串(由预处理器转换)

本质上,如果您希望您的代码与
char
一起工作,您可以将
复制函数定义为
memcpy
。对于
wchar\u t
,您将其定义为
wmemcpy
。您的size参数只是字符数(要么
char
要么
wchar\u t
);请记住,参数不一定是固定大小的数组,因此使用
sizeof
并不总是一个选项

例如,Win32 API使用了类似的策略:如果定义
UNICODE
预处理器符号,大多数函数将解析为其宽字符版本(后缀为W),但在其他情况下,它们将解析为“窄”字符版本(后缀为a)
TCHAR
相应地定义为
char
wchar\u t
;等等。结果是你可以很容易地编写使用宽字符或规则字符的代码


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

除了davmac关于API对称性和数组大小的回答,还应该强调的是,
wmemcpy
的第三个参数是指要复制的元素数(而不是字节数)

如果您使用
wchar\t
对象,并使用
中的其他函数处理它们,则可能会有助于解决问题<例如,code>wcslen
根据
wchar\u t
元素返回C宽字符串长度,
wcschr
wcsrchr
返回
wchar\u t*
,因此使用它们执行一些指针算法也会使您处于元素数量的“领域”

注意:如果最小
wchar\u t
数组的大小如您的示例所示,使用
wmemcpy
可能会产生比您使用的
sizeof(wchar\u数组)
更优雅的代码:

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

一个薄弱的原因可能是,当您有一个
wchar\u t
数组时,
wmemcpy
可能会更有效,因为它可以采用适当的对齐方式。@Lashane:术语“Word”不是“2字节”的同义词。正如“1字节”不是8位一样。@Lashane:在没有必要的情况下使用错误的术语是没有什么用处的。“八位组”这个词只需要多打一个字母。声明“word==2字节”是个坏主意(你显然注意到了自己)。“我知道这一点”-问题是这是由初学者阅读的,他们大多认为这样的陈述是普遍有效的。只需看看这里的问题,以及由于用户对尺寸做出错误假设而导致的错误。@JordanMelo在您刚才询问之前,我从未听说过wmemcpy。我同意它的存在似乎没有道理。我,我永远不会用它。@Olaf你在“字节”上打一场败仗。这是一个有多重含义的词(就像“黑客”)。对于至少99%的说话人来说,在常用用法中,“字节”表示“8位”。我不确定这是否有意义,因为我经常需要
memcpy
整数或浮点数之类的东西。为什么不使用
imempy()
fmemcpy()
?为什么
wchar\u t
有自己的功能
memcpy
的工作原理是
char
是单个字节,而不是字符
wchar\u t
没有那个特殊属性,但是int和float(通常)不用于保存字符<代码>图表和
wchar\t
都是;它们之间的区别主要在于它们的宽度/范围。正因为如此,您可能希望编写与其中一个(或至少可以切换以支持其中一个)一起工作的代码是有道理的。我想我想说的是,我不认为
memcpy
适合于字符/字符串。如果是,我希望它使用
char*
而不是一个
void*
@cornstals,它不是针对字符串的,但您仍然可以使用它复制字符串;您可以将
char*
传递给它,而不会发出任何问题。我并不是说这通常应该做到,但它是可以做到的,而且可能已经做到了。我可以轻松地将我的复制函数定义为类似于
\define copy(dest,src,size)memcpy(dest,src,(size)*2)
而不是
wmemcpy(dest,src,size)
for
wchar\t
,并获得同样的效果。这是一个相当简单的转换。但这是一个很好的观点,说明为什么有人可能想要它。
#define SIZE 40
wchar_t wchar_array[SIZE];
// ...
wmemcpy(dest, wchar_array, SIZE);