簡體   English   中英

當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 你的size參數只是字符數( charwchar_t ); 請記住,參數不一定是固定大小的數組,因此使用sizeof並不總是一個選項。

例如,Win32 API使用類似的策略:如果定義UNICODE預處理器符號,大多數函數將解析為其寬字符版本(后綴為W),否則它們將解析為“窄”字符版本(后綴為A) ; TCHAR定義為charwchar_t ; 結果就是你可以很容易地編寫適用於寬字符或常規字符的代碼。

當然,這絕不是必要的 ; 但是,標准C庫不一定是絕對最小的。 你可以說calloc是多余的,因為你總是可以使用malloc然后使用memset ; 然而,它仍然存在。

除了davmac關於API對稱性的答案並且不總是授予數組的大小之外,應該強調的是wmemcpy的第三個參數是wmemcpy復制的元素的數量(而不是字節)。

如果您使用wchar_t對象並使用<wchar.h>其他函數處理它們,則可能會<wchar.h>幫助。 例如, wcslen根據wchar_t元素返回C寬字符串長度,而wcschrwcsrchr返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM