解释这个宏

时间:2010-05-11 09:20:59

标签: c++ mfc file-io string

#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()方法的第一个参数传递。

3 个答案:

答案 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构建中,它的计算结果为LL"XYZ"),它告诉编译器字符串文字是一个宽字符串。这和各种“T”字符串typedef LPCTSTR等允许您编写为unicode和非unicode构建正确构建的代码。

请注意,谷歌是您的朋友,只需在谷歌中输入_T即可获得several有用的结果......