【问题标题】:explain this macro解释这个宏
【发布时间】:2010-05-11 09:20:58
【问题描述】:
#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() 方法。

【问题讨论】:

  • 顺便说一句,你在任何情况下都不会通过你投入的演员阵容从char *“转换”到LPCTSTR。您强制编译器以您认为应该查看的方式查看提供的字节,而不是编译器的类型系统当前理解它们的方式。恕我直言,如果从那时起演员表似乎起作用了,那情况会更糟,你会认为简单地加入演员表来强制代码编译是一件好事。从来都不是。在添加演员表之前,您应该始终了解自己在做什么。

标签: c++ mfc file-io string


【解决方案1】:

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

#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* 文字转换为 Long 表示形式(从 byte-wide 表示到 sizeof(wchar_t)-wide 表示)。

【讨论】:

  • 仍然想知道如何以编程方式将 ANSI 字符串转换为 unicode
  • 看看MultiByteToWideCharWideCharToMultiByte。如果您在代码中使用 WinAPI,那么这两个就足够了。否则: - 将 ASCII 字符从 char* 转换为 wchar_t* 只需转换每个字符(伪代码): for_each(chr in [source char*]) dest += wchar_t( chr ); - 从 wchar_t* 转换为 char*只要 char 值仅在 ANSI 子集中(将每个 wchar_t 转换为 char 并将值附加到目标 char*),请执行相同操作。 - 如果你想要通用字符转换,你需要处理不同的代码页(即我不知道:()。
【解决方案2】:

宏只是用参数对 L 进行字符串化,这样:

_T("xyz")

变成:

L"xyz"

这是创建 wstring 的方法,但在非 Unicode 版本中,_T 将映射为空,因此您将在那里获得常规字符串。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多