【发布时间】:2016-02-09 21:33:09
【问题描述】:
我在 C++ 中正确使用 TCHAR 和 _T() 时遇到问题。宽/窄字符表示的差异正在发生一些奇怪的事情
我有来自服务器的响应,它只是一个表示为 TCHAR* 的字符串
TCHAR * response = getTheResponseFromTheServer();
我想将此值与可能值的数组进行比较,看看它们是否匹配。我已经这样定义了数组:
TCHAR * knownCodes[] = {_T("appleCode"), _T("pearCode"), _T("grapeCode")};
但由于某种原因,当我使用 tcsmpr 比较数组中的值和响应时,它们不相等
_tcscmp(response, KnownProductCodes[i]) //this never returns 0; they are not equal even when i know they are
当我用 %s 将它们都打印出来时,只有数组中的已知代码正确显示,响应代码与 ????'s 混淆
当我用 %hs 打印它们时,响应代码显示正确,并且只显示 knownCodes[i] 的第一个字母。 (a、p 或 g)
正确打印时,它们都打印相同的字符串“appleCode”
显然我对 char 和 wchar 之间的区别或如何使用数组有某种错误信息。
任何帮助将不胜感激。
【问题讨论】:
-
你真的应该展示
getTheResponseFromTheServer函数的作用。也许您正在返回一个指向存储在堆栈上的缓冲区的指针。 -
我实际上没有那个代码。我想知道为什么你认为它是相关的?我知道响应中有正确的字符串。我可以打印出来,它是正确的。只是已知代码与响应的字符格式不同。
-
在这种情况下,你确定它返回一个
wchar_t*吗?TCHAR的问题在于它是一个改变类型大小的宏,具体取决于编译时指定的选项。如果您要链接到某个库,则可能是该库的TCHAR实际上是char,而您的编译为wchar_t。您应该打开all编译器警告并检查是否有针对TCHAR * response = getTheResponseFromTheServer();的警告生成 -
您也可以试试这个(如果您的编译器支持 C++11 或更高版本):
auto response = getTheResponseFromTheServer(); static_assert( sizeof(*response) == sizeof(TCHAR), "TCHAR strikes again" ); -
感谢您在这里帮助我。我会尝试找出是否有任何警告。让我们假设响应实际上以 char* 而不是 wchar_t* 的形式返回。不应该进行简单的转换吗?