#define __T(x) L ## x
在代码中找到一个MFC源头文件。它主要用于将字符串转换为........(我不知道是什么)。如果我是正确的,它会将字符串转换为LPCTSTR ...不知道该类型是什么......
我似乎无法将char *转换为LPCTSTR。在MFC文件处理时,以下代码在尝试打开文件时总是会返回错误...
char* filepath = "C:\\Program Files\\Microsoft Office\\Office12\\BITMAPS\\STYLES\\GLOBE.WMF";
if( !file.Open((LPCTSTR)filepath , CFile::modeRead, &fexp) )
{
fexp.ReportError();
return 1;
}
但是如果我这样写,它就不会出错:
if( !file.Open( _T("C:\\Program Files\\Microsoft Office\\Office12\\BITMAPS\\STYLES\\GLOBE.WMF") , CFile::modeRead, &fexp) )
{
fexp.ReportError();
return 1;
}
我正在考虑将变量作为CFile :: Open()方法的第一个参数传递。
答案 0 :(得分:2)
##运算符是预处理程序连接运算符。也就是说,这是有效的代码:
#define DECLARE_PTR(X) typedef std::auto_ptr<X> X##Ptr
DECLARE_PTR(int); // gets expanded to typedef std::auto_ptr<int> intPtr
intPtr i(new int(1));
在您的情况下,_T
宏会将Long转换符号(L
)添加到给定的输入中。这仅适用于字符串文字。这意味着你不能写
char* str = "ABC";
wchar_t* wstr = _T(str); // error: Lstr is undefined
但你可以安全地写
char* str = "ABC";
LPTSTR wstr = _T("ABC"); // OK, gets expanded to wchar_t * wstr = L"ABC";
// when UNICODE is defined
// and char * wstr = "ABC"; when unicode is not defined
L
运算符是char和char * literals到long表示的转换器(从byte
- 宽表示到sizeof(wchar_t)
- 宽表示)。
答案 1 :(得分:1)
宏只是用参数对L进行字符串化,以便:
_T("xyz")
变为:
L"xyz"
这是制作wstring
的方法,但在非Unicode版本中,_T
将映射为空,因此您将在那里获得常规字符串。
答案 2 :(得分:1)
_T()
允许您设置字符串文字,以便您可以构建为Unicode或非unicode。
在非unicode构建中,它的计算结果为空,因此字符串文字表示为"XYZ"
,这是一个普通的窄字符串。在unicode构建中,它的计算结果为L
(L"XYZ"
),它告诉编译器字符串文字是一个宽字符串。这和各种“T”字符串typedef LPCTSTR
等允许您编写为unicode和非unicode构建正确构建的代码。
请注意,谷歌是您的朋友,只需在谷歌中输入_T
即可获得several有用的结果......