我被要求为现有的旧项目添加功能,但我无法构建它.它处理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) {
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
在上面的行中,例如,当使用wcscmp时,我得到了
argument of type "_TCHAR *" is incompatible with parameter of type "const wchar_t *"
Run Code Online (Sandbox Code Playgroud)
关于argv [i]
和
argument of type "const char *" is incompatible with parameter of type "const wchar_t *"
Run Code Online (Sandbox Code Playgroud)
关于_T(" - h").
任何建议都会非常感激.
Dav*_*nan 10
代码已编写为目标Unicode而不是MBCS.这可以通过使用wcscmp接受类型的参数来辨别const wchar_t*.
另一方面,有部分代码使用TCHAR和相关的宏.现在,TCHAR是解析为一个宏char或wchar_t取决于是否_UNICODE或_MBCS定义.有关详细信息,请参阅文档.
TCHAR开发人员希望为Windows NT/2000(支持ANSI和Unicode API)和Windows 95/98(仅具有ANSI API)编写代码时使用的词干.使用TCHAR允许公共代码库.编译_UNICODE为NT/2000定义,并使用_MBCS95/98的定义进行编译.
如果你用这种风格编码,那么你就写_tcscmp而不是wcscmp.对于Unicode构建,它会解析wcscmp,对于MBCS构建,它会解析为_mbscmp.
这些天你通常不需要编写代码来支持95/98.您可以选择忽略这些平台.在这种情况下,您应该定位Unicode并停止使用TCHAR和相关的宏.替换_T("..")为L"..".替换tmain为wmain.替换TCHAR为wchar_t.等等.
您无需进行这些更改.您可以简单地定位Unicode,您的代码将编译.但是,TCHAR习惯用法在代码库中的应用不一致.注意使用_tmain,, TCHAR还要调用wcscmp.所以你的代码无法编译,除非它以Unicode为目标.所以放弃你就没有失去任何东西TCHAR.你获得的是清晰度.您可以停止使用这些宏并避免它们提供的所有混淆.间接是一个很好的工具,但如果不需要它,那么它只会导致混淆和混淆.
| 归档时间: |
|
| 查看次数: |
11595 次 |
| 最近记录: |