C++ 解释这个宏

C++ 解释这个宏,c++,mfc,file-io,string,C++,Mfc,File Io,String,在MFC源头文件之一的代码中找到。它主要用于将字符串转换为。。。。。。。。(我不知道是什么)。如果我是正确的,它将字符串转换为LPCTSTR…也不知道该类型是什么 我似乎无法将char*转换为LPCTSTR。在处理MFC文件时,以下代码在尝试打开文件时将始终返回错误 #define __T(x) L ## x 但如果我这样写,它不会给出错误: char* filepath = "C:\\Program Files\\Microsoft Office\\Office12\\BI

在MFC源头文件之一的代码中找到。它主要用于将字符串转换为。。。。。。。。(我不知道是什么)。如果我是正确的,它将字符串转换为LPCTSTR…也不知道该类型是什么

我似乎无法将char*转换为LPCTSTR。在处理MFC文件时,以下代码在尝试打开文件时将始终返回错误

#define __T(x)      L ## x
但如果我这样写,它不会给出错误:

    char* filepath = "C:\\Program Files\\Microsoft Office\\Office12\\BITMAPS\\STYLES\\GLOBE.WMF";

    if( !file.Open((LPCTSTR)filepath , CFile::modeRead, &fexp) )
    {
        fexp.ReportError();
        return 1;
    }

我正在考虑将一个变量作为第一个参数传递给CFile::Open()方法。

宏只是用参数字符串化L,以便:

    if( !file.Open( _T("C:\\Program Files\\Microsoft Office\\Office12\\BITMAPS\\STYLES\\GLOBE.WMF") , CFile::modeRead, &fexp) )
    {
        fexp.ReportError();
        return 1;
    }
变成:

_T("xyz")

这是生成
wstring
的方法,但在非Unicode版本中,
\u T
将映射为nothing,因此您将在那里获得常规字符串。

宏只是使用参数字符串化L,以便:

    if( !file.Open( _T("C:\\Program Files\\Microsoft Office\\Office12\\BITMAPS\\STYLES\\GLOBE.WMF") , CFile::modeRead, &fexp) )
    {
        fexp.ReportError();
        return 1;
    }
变成:

_T("xyz")
这是制作
wstring
的方法,但是在非Unicode版本中,
\u T
将映射为空,因此您将在那里获得常规字符串。

\u T()
允许您设置字符串文本,以便可以构建为Unicode或非Unicode

在非unicode构建中,它的计算结果为零,因此字符串文本表示为
“XYZ”
,这是一个普通的窄字符串。在unicode构建中,其计算结果为
L
L“XYZ”
),这告诉编译器字符串文字是宽字符串。这和各种“T”字符串typedefs
LPCTSTR
等允许您为unicode和非unicode构建编写正确构建的代码

请注意,google是您的朋友,只需在google中键入
\u T
即可获得有用的结果…

\u T()
允许您设置字符串文本,以便可以构建为Unicode或非Unicode

在非unicode构建中,它的计算结果为零,因此字符串文本表示为
“XYZ”
,这是一个普通的窄字符串。在unicode构建中,其计算结果为
L
L“XYZ”
),这告诉编译器字符串文字是宽字符串。这和各种“T”字符串typedefs
LPCTSTR
等允许您为unicode和非unicode构建编写正确构建的代码

请注意,google是您的朋友,只需在google中键入
\T
即可获得有用的结果…

运算符是预处理器连接运算符。也就是说,这是有效代码:

L"xyz"
但是你可以放心地写

char* str = "ABC";
wchar_t* wstr = _T(str); // error: Lstr is undefined
L
运算符是字符和字符*文本到长表示(从
字节
宽表示到
sizeof(wchar\u t)
宽表示)的转换器。

运算符是预处理器串联运算符。也就是说,这是有效代码:

L"xyz"
但是你可以放心地写

char* str = "ABC";
wchar_t* wstr = _T(str); // error: Lstr is undefined

L
运算符是字符和字符*文本到长表示(从
byte
-宽表示到
sizeof(wchar\u t)
-宽表示)的转换器。

顺便说一句,你不会以任何方式用你扔进去的那个类型从
char*
转换到
LPCTSTR
。您强制编译器以您认为应该查看的方式查看提供的字节,而不是编译器的类型系统当前理解它们的方式。IMHO,如果强制转换从那时起就开始工作,情况会糟糕得多,你可能会认为简单地加入强制转换来强制编译代码是一件好事。从来没有。在添加类型转换之前,您应该始终了解自己在做什么。顺便说一句,您不会以任何方式将您在其中添加的类型转换从
char*
转换为
LPCTSTR
。您强制编译器以您认为应该查看的方式查看提供的字节,而不是编译器的类型系统当前理解它们的方式。IMHO,如果强制转换从那时起就开始工作,情况会糟糕得多,你可能会认为简单地加入强制转换来强制编译代码是一件好事。从来没有。在添加强制转换之前,您应该始终了解正在执行的操作。仍然想知道如何将ANSI字符串转换为unicode程序。请查看
MultiByteToWideChar
WideCharToMultiByte
。如果在代码中使用WinAPI,这两个就足够了。否则:-要将ASCII字符从
char*
转换为
wchar\u t*
只需强制转换每个字符(伪代码):for_each(chr in[source char*])dest+=
wchar\u t(chr)
-要从
wchar\u t*
转换为
char*
请执行相同的操作,只要
char
值仅在ANSI子集中(将每个
wchar\u t
转换为
char
并将值附加到目标
char*
)-如果您想要通用字符转换,您需要处理不同的代码页(例如,我不知道:()。仍然想知道如何通过编程将ANSI字符串转换为unicode。请查看
MultiByteToWideChar
WideCharToMultiByte
。如果您在代码中使用WinAPI,这两个字符就足够了。否则:-要将ASCII字符从
char*
转换为
wchar\u t*
,只需强制转换每个字符(伪代码):for each(chr in[source char*])dest+=
wchar\u t(chr)
-要从
wchar\u t*
转换为
char*
,只要
char
值仅在ANSI子集中(将每个
wchar\u t
转换为
char
,并将值附加到目标
char*
)-如果您想要通用字符转换,您需要处理不同的代码页(例如,我不知道:())。