2010-05-11 76 views
0
#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()方法的第一个参数。

+1

顺便说一句,您不会以任何方式将'char *'转换为'LPCTSTR',并将其投掷到那里。您迫使编译器以您认为应该查看的方式查看提供的字节,而不是编译器的类型系统当前理解它们的方式。如果演员出现工作,那么,恕我直言,这会变得更加糟糕,因为那时你会认为只是抛出演员来强制代码编译是件好事。它不是,永远。在添加演员之前,你应该总是明白你在做什么。 – 2010-05-11 10:05:46

回答

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宏观预先将长转换符号(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运营商是炭和炭的转换*文字为Long表示(从byte - 宽表示,以sizeof(wchar_t)范围内的代表)。

+0

仍然想知道如何以编程方式将ANSI字符串转换为unicode – deostroll 2010-05-11 13:53:01

+0

然后,或许您应该在您的问题中提及... – 2010-05-11 14:19:21

+0

查看'MultiByteToWideChar'和'WideCharToMultiByte'。如果你在你的代码中使用WinAPI,这两个就足够了。 否则: - 将ASCII char从'char *'转换为'wchar_t *'只转换每个char(伪代码): for_each([source char *]中的chr)dest + ='wchar_t(chr);' - 只要'char'值只在ANSI子集中(将每个'wchar_t'转换为'char'并将值附加到目的地,从'wchar_t *'转换为'char * '字符*')。 - 如果你想通用字符转换,你需要处理不同的代码页(即我不知道:()。 – utnapistim 2010-05-12 10:15:06

1

宏简单字符串化●具有参数,这样:

_T("xyz") 

变为:

L"xyz" 

这是使wstring的方式,但在非Unicode版本,_T将映射到什么都没有,所以你会在那里得到规则的字符串。

1

_T()允许您设置字符串文字,以便您可以构建为Unicode或非Unicode。

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

注意,谷歌是你的朋友,只需键入_T到谷歌给出了several有用的结果...