【发布时间】:2010-12-30 07:36:23
【问题描述】:
我在互联网上搜索了大约 2 个小时,但没有找到任何工作解决方案。
我的程序有多字节字符集,在我得到的代码中:
WCHAR value[1];
_tcslen(value);
在编译时,我得到了错误:
'strlen' : 无法转换参数 1 从 'WCHAR [1]' 到 'const char *'
如何将此 WCHAR[1] 转换为 const char * ?
【问题讨论】:
我在互联网上搜索了大约 2 个小时,但没有找到任何工作解决方案。
我的程序有多字节字符集,在我得到的代码中:
WCHAR value[1];
_tcslen(value);
在编译时,我得到了错误:
'strlen' : 无法转换参数 1 从 'WCHAR [1]' 到 'const char *'
如何将此 WCHAR[1] 转换为 const char * ?
【问题讨论】:
使用转换函数 WideCharToMutliByte() 。
http://msdn.microsoft.com/en-us/library/dd374130(VS.85).aspx
【讨论】:
我假设不是很有用的 1-length WCHAR 数组只是一个例子......
_tcslen 不是函数;它是根据_UNICODE 定义扩展为strlen 或wcslen 的宏。如果您使用的是多字节字符集(这意味着 _UNICODE 未定义)并且您有一个 WCHAR 数组,则必须明确使用 wcslen。
(除非您专门使用 TCHAR,否则您可能希望避免使用 _t 函数。在 http://msdn.microsoft.com/en-us/library/szdfzttz(VS.80).aspx 的 MSDN 中有一个不太好的概述;有人知道更好的吗?)
【讨论】:
_tcslen 仅在您的环境中为 #defined UNICODE 时才将 WCHAR 指针或数组作为输入。
从错误消息中,我会说它不是
定义 unicode 的最佳方式是将其作为参数传递给编译器。对于 Microsoft C,您将使用 /D 开关
cl -c /DUNICODE myfile.cpp
或者您可以将数组声明更改为 TCHAR,当 UNICODE 不是#defined 时,_tcslen 将是 char,而当它是 WCHAR 时,它将是 char。
【讨论】:
如果您希望 _tcslen 为 wcslen,请尝试在 VS 的项目设置中设置“使用 unicode”,将其设置为“使用多字节”以将 _tcslen 设置为 strlen。正如一些人已经指出的那样,_t 前缀函数(实际上与许多其他函数一样,例如 MessageBox())是基于 _UNICODE 预编译器定义值“扩展”的宏。
另一种选择是在您的代码中使用TCHAR 而不是WCHAR。虽然我想说一个更好的主意是坚持使用 wchar_t 或 char 类型并使用适当的函数。
最后但同样重要的是,由于问题标记为 c++,请考虑使用 std::string(或 std::wstring)和 std::vector 而不是 char 缓冲区。使用带有 C API 函数的函数很简单,而且通常更安全。
【讨论】: