我被要求向现有的旧项目添加功能,但我无法构建它。
它处理 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]
and
argument of type "const char *" is incompatible with parameter of type "const wchar_t *"
关于 _T("-h")。
任何建议将不胜感激。
该代码是针对 Unicode 而不是 MBCS 编写的。这可以通过使用来辨别wcscmp
它接受类型的参数const wchar_t*
.
另一方面,代码的某些部分使用了TCHAR
以及相关的宏。现在,TCHAR http://msdn.microsoft.com/en-us/library/c426s321.aspx是一个宏,可以解析为char
or wchar_t
取决于是否_UNICODE
or _MBCS
被定义。咨询文档 http://msdn.microsoft.com/en-us/library/c426s321.aspx更多细节。
指某东西的用途TCHAR
源于开发人员希望为 Windows NT/2000(支持 ANSI 和 Unicode API)和 Windows 95/98(仅支持 ANSI API)编写代码的时代。指某东西的用途TCHAR
允许通用的代码库。编译用_UNICODE
为 NT/2000 定义,并编译_MBCS
定义为 95/98。
如果你用这种风格编码,那么你会写_tcscmp
而不是wcscmp
。对于 Unicode 构建,它解决了wcscmp
,对于 MBCS 构建,它解析为_mbscmp
.
如今,您通常不需要编写代码来支持 95/98。您可能可以选择忽略这些平台。在这种情况下,您应该以 Unicode 为目标并停止使用TCHAR
以及相关的宏。代替_T("..")
with L".."
。代替tmain
with wmain
。代替TCHAR
with wchar_t
。等等。
您不需要进行这些更改。您可以简单地以 Unicode 为目标,然后您的代码就会编译。但是,那TCHAR
习惯用法在您的代码库中的应用不一致。注意使用_tmain
, TCHAR
,还调用wcscmp
。因此,除非您的代码以 Unicode 为目标,否则无法编译。所以放弃你不会有任何损失TCHAR
。你所获得的是清晰度。您可以停止使用这些宏并避免它们提供的所有混淆。间接是一个很好的工具,但如果不需要它,那么它只会导致混乱和混淆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)