我对unsigned char(在WinAPI中也是BYTE)和char指针之间的差异感到困惑.
目前我正在使用一些基于ATL的遗留代码,我看到很多表达式如下:
CAtlArray rawContent;
CALL_THE_FUNCTION_WHICH_FILLS_RAW_CONTENT(rawContent);
return ArrayToUnicodeString(rawContent);
// or return ArrayToAnsiString(rawContent);
现在,ArrayToXXString的实现看起来如下:
CStringA ArrayToAnsiString(const CAtlArray& array)
{
CAtlArray copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
// Casting from BYTE* -> LPCSTR (const char*).
return CStringA((LPCSTR)copiedArray.GetData());
}
CStringW ArrayToUnicodeString(const CAtlArray& array)
{
CAtlArray copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
copiedArray.Add('\0');
// Same here.
return CStringW((LPCWSTR)copiedArray.GetData());
}
所以,问题:
>对于所有可能的情况,从BYTE *到LPCSTR(const char *)的C风格演员是否安全?
>在将数组数据转换为宽字符串时,是否真的有必要添加双重空终止?
>转换例程CStringW((LPCWSTR)copiedArray.GetData())对我来说似乎无效,是真的吗?
>任何方式使所有这些代码更容易理解和维护?