【问题标题】:C++ Confusing MacrosC++ 混淆宏
【发布时间】:2020-03-31 18:08:31
【问题描述】:

我在查看一些 windows directx 应用程序代码,看到他们使用宏 _T(x) 来设置他们的窗口名称,在查看宏定义时我看到了这个

#define _T(x)       __T(x)

然后我跟着看了看__T

#define __T(x)      x

为什么会存在?

【问题讨论】:

  • 可能与字符串转换有关。你能找到一个使用它的例子吗?编辑:stackoverflow.com/questions/240353/… 是我的想法,但情况不同。
  • Unicode Programming Summary _T 是一个宏,根据设置,它可能会做一些事情。
  • 此处使用:WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };或者在这里:HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX9 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
  • 我猜 DirectX 曾经与 MBCS 和 Unicode 应用程序一起工作。因此_T 是用于根据构建类型表示宽或窄字符串的宏。另外,请注意GetModuleHandle 也是一个宏——它实际上是GetModuleHandleAGetModuleHandleW,同样取决于构建。所以它与_T 的情况相同,即根据构建类型而变化。
  • 我知道 GetModuleHandle 是如何工作的。看GetModuleHandle的宏定义时,直接显示了这两种情况,看_T时却没有

标签: c++


【解决方案1】:

_T(x) 通常是与平台无关的文本字符类型的宏。在某些平台上,它可能仅解析为 x。在其他使用宽字符的情况下,它可能会解析为L ## x,例如_T("abc") 可以解析为 "abc"L"abc"

【讨论】:

  • 不知道为什么这被否决了;这是正确的答案。您可能还会提到这是一种视窗主义。
  • 哦,有道理,不管我在哪里看,它的定义总是一样的,我猜我只是看的不够深,谢谢!
  • @Noah 如果您更改构建环境中的某些设置,例如对 unicode 的支持,您可能会说它的定义不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2021-01-26
  • 2011-09-04
相关资源
最近更新 更多