使用 TCHAR 时出错,无法转换为 wchar_t
Posted
技术标签:
【中文标题】使用 TCHAR 时出错,无法转换为 wchar_t【英文标题】:Errors using TCHAR,cannot convert to wchar_t 【发布时间】:2014-02-11 00:44:08 【问题描述】:有人要求我向现有的旧项目添加功能,但我无法构建它。 它处理 unicode 字符串,但我在使用 TCHAR 时遇到很多错误。特别是几乎每个错误都是 TCHAR 无法转换为或用作 wchar_t。 从我在许多不同的文章中看到的情况来看,我尝试使用#define _UNICODE 或#define UNICODE,但它们都没有解决问题。
这是一段代码:
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <strsafe.h>
#include <string>
#include <list>
#include <cctype>
#include <winnt.h>
#include <atlconv.h>
#pragma comment(lib,"wininet.lib")
using namespace std;
TCHAR *tags[] = _T("aa"), _T("bb"), _T("cc"),
NULL ;
int _tmain(int argc, _TCHAR* argv[])
int i = 0;
for (i = 1; i<argc; i++)
if (wcscmp(argv[i], _T("-h")) == 0)
...
else if (wcscmp(argv[i], _T("-f")) == 0)
...
...
例如,在上面的行中,当使用 wcscmp 时,我得到了
argument of type "_TCHAR *" is incompatible with parameter of type "const wchar_t *"
关于 argv[i]
和
argument of type "const char *" is incompatible with parameter of type "const wchar_t *"
关于 _T("-h")。
任何建议将不胜感激。
【问题讨论】:
【参考方案1】:代码已针对 Unicode 而不是 MBCS 编写。这可以通过使用wcscmp
来识别,它接受const wchar_t*
类型的参数。
另一方面,部分代码使用TCHAR
和相关宏。现在,TCHAR
是一个宏,可以解析为 char
或 wchar_t
,具体取决于是否定义了 _UNICODE
或 _MBCS
。详情请咨询documentation。
TCHAR
的使用源于开发人员希望为 Windows NT/2000(支持 ANSI 和 Unicode API)和 Windows 95/98(只有 ANSI API)编写代码的日子。 TCHAR
的使用允许一个通用的代码库。使用为 NT/2000 定义的_UNICODE
编译,并使用为 95/98 定义的_MBCS
编译。
如果你用这种风格编码,那么你写_tcscmp
而不是wcscmp
。对于 Unicode 构建,它解析为 wcscmp
,对于 MBCS 构建,它解析为 _mbscmp
。
如今,您通常不需要编写代码来支持 95/98。您可能会选择忽略这些平台。在这种情况下,您应该针对 Unicode 并停止使用 TCHAR
和相关宏。将_T("..")
替换为L".."
。将tmain
替换为wmain
。将TCHAR
替换为wchar_t
。以此类推。
您无需进行这些更改。您可以简单地以 Unicode 为目标,您的代码将编译。但是,TCHAR
成语在您的代码库中的应用不一致。请注意_tmain
、TCHAR
的使用,以及对wcscmp
的调用。因此,除非以 Unicode 为目标,否则您的代码无法编译。因此,放弃TCHAR
并不会造成任何损失。你得到的是清晰。您可以停止使用这些宏并避免它们提供的所有混淆。间接是一个很好的工具,但如果不需要它,它只会导致混乱和混淆。
【讨论】:
非常好的答案!我真的想知道这种编码是否真的有必要。谢谢大卫!【参考方案2】:您似乎没有为 Unicode 构建应用程序,因此请检查您的项目设置。
如果您使用像wcscmp
这样的宽字符串函数,那么使用_T()
宏没有任何意义,因为在非Unicode 模式下编译时您的com 将无法编译。当您需要使用<tchar.h>
中的TCHAR
感知函数如_tcscmp 时,如果您希望代码在这两种模式下编译。
如果您总是希望字符串变宽,则在 from 处放置 L
,例如 L"Hello, world"
【讨论】:
感谢您的帮助。更改设置可以解决问题,所以我想知道您所说的是否有我想在非 Unicode 模式下编译的情况? @yiannis 我试图在我的回答中解决这个问题。我认为您应该做的不仅仅是切换到 Unicode 定位。我认为您应该摆脱使用不一致的令人困惑的TCHAR
成语。【参考方案3】:
如果您使用的是 Visual Studio,请将 字符集 设置为 使用 Unicode 字符集 在项目 配置属性 下。
我认为您可以使用#define UNICODE,但请确保在任何包含之前使用它。
【讨论】:
以上是关于使用 TCHAR 时出错,无法转换为 wchar_t的主要内容,如果未能解决你的问题,请参考以下文章
在windows下的QT编程中的_TCHAR与QString之间的转换