宏字符串:#define __T(x) x 是啥意思?和 __T(#x)?

Posted

技术标签:

【中文标题】宏字符串:#define __T(x) x 是啥意思?和 __T(#x)?【英文标题】:Macro string: what does #define __T(x) x mean? And __T(#x)?宏字符串:#define __T(x) x 是什么意思?和 __T(#x)? 【发布时间】:2012-05-09 11:21:48 【问题描述】:

这是什么意思?

#define __T(x)  x

只返回 x?

我看到的代码使用了我以前从未见过的语法:

#define CREATE_ENCODER(CODEC) \
strcpy(codecName, __T(#CODEC); \
pCodec = new CODEC##VideoEncoder();
if(parFileName) \
  pEncoderParams = new CODEC##EncoderParams; \

# 是什么意思?

【问题讨论】:

【参考方案1】:

其实__T是用来把字符串转成wchar_t*或者char*的,在tchar.h中你有:

#define __T(x)      L ## x

在启用 UNICODE 时使用,并且

#define __T(x)      x

当它被禁用时

如果要在您使用的 UNICODE 和非 UNICODE 编译上编译您的代码:

TCHAR* sz = __T("我的文字");

大多数 WINAPI 函数使用 TCHAR* 或其某些形式

其实我更喜欢 _T() 版本,从来不知道 __T 版本存在,在 tchar.h 的底部你已经定义了它:

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

回到你的例子:

strcpy(codecName, __T(#CODEC)); \

相当于:

strcpy(codecName, "CODEC"); \

关于非 unicode 构建,并且

strcpy(codecName, L"CODEC"); \

在 UNICODE 构建上

非常重要!!:使用 _T 或 __T 并不足以确保您的代码是 UNICODE 兼容的。它将更容易调用 WINAPI 函数。您必须准备好代码才能使用 UNICODE。

【讨论】:

重要提示:此标头(和宏)特定于 Windows,因为它不使用 UTF-8 表示 Unicode。 这不太正确。首先,当然,char 文本完全可以成为 Unicode:想想 UTF-8。其次,仅更改宏不会使您的代码符合 Unicode。不仅仅是字符类型是 16 位还是只有 8 位。像TCHAR 这样的东西实际上是一种欺诈:虚假广告,因为它们无法兑现承诺。 这就是您在 Windows、Windows-ce(仅限 UNICODE)下使用 visual-c++ 编码的方式。没有 UTF-8,winapi 函数接受 char(您必须注意编码)或 wchar_t(2 字节 UNICODE)。问题有一个标签visual-c++,所以我想MS特定的答案是可以的。我认为这很明显,但我添加了评论 __T 不会将您的应用程序变成符合 unicode 的代码:) 再看代码。原始问题有两个下划线:__T(x),而不是 _T(x)。【参考方案2】:

是的,该定义被简单地替换为传递的值。如果您经常使用这种定义,例如希望在编译时确定是否要通过转换函数 (#define __T(x) translate(x)) 传递值 (#define __T(x) x)。

# 将传递的值字符串化:http://gcc.gnu.org/onlinedocs/cpp/Stringizing.html## 是连接运算符:http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

【讨论】:

感谢您的链接。

以上是关于宏字符串:#define __T(x) x 是啥意思?和 __T(#x)?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义宏以将连接的char字符串转换为C中的wchar_t字符串

#define _clr(x) memset(x,0xff,sizeof(int)*n) 是啥意思?

Windows Unicode相关

C语言宏技巧 X宏

C语言宏技巧 X宏

Unicode环境下的字符差异