我正在进行一些win32字符串API调用,并假设字符串是宽字符串,这在XP和更新版本上有效。我怎么能断言呢?这是运行时检查还是编译时检查?
我做错了吗?这是一个例子:
typedef std::basic_string<TCHAR> TString;
inline TString queryRegStringValue(HKEY key, const TString& subkey,
const TString defaultValue = TEXT(""))
{
std::vector<char> out_bytes(256);
DWORD num_bytes = out_bytes.size();
DWORD out_type;
long retval = RegQueryValueEx(key, subkey.c_str(), 0, &out_type,
reinterpret_cast<BYTE*>(&out_bytes[0]), &num_bytes); //comes out as a platform string. wide on XP
if (retval != 0)
return defaultValue;
if (num_bytes > 0)
{
assert(out_type == REG_SZ);
BOOST_STATIC_ASSERT(sizeof(TCHAR)==2); //what if someone runs my code on an older system?
return TString(reinterpret_cast<wchar_t*>(&out_bytes[0]), num_bytes/2); //assumes windows XP (wide string)
}
return TEXT("");
}
答案 0 :(得分:4)
这不是问题。在XP发布之前很久,Windows已经成为过去17年的原生Unicode操作系统。 David Cutler的脑子NT 3.1从第一天开始就是Unicode。
如果您的程序落在Window 9x机器上,那么仍然有一个API层可以将您的UTF-16字符串转换为8位字符。使用TCHAR进行新代码开发没有任何意义。
答案 1 :(得分:1)
我认为这篇MSDN文章正是您所需要的。您想知道您所使用的Windows版本,并根据需要调整字符串处理?如果我误解了,请随时发表评论,我会调整我的答案。
答案 2 :(得分:1)
我认为正在发生的事情是,当我编译时,我针对Unicode windows API进行编译,因此如果我在非widechar窗口上运行我的可执行文件,它将无法运行。因此,运行时检查是无用的。
我添加了编译时断言来强制构建错误,如果我们在非widechar平台(XP之前,或2000之前,或其他任何东西)上编译,则构建将失败。如果断言不在那里它无论如何都会失败,但更加隐秘。