4

这是什么意思?

#define __T(x)  x

只返回x?

我正在使用以前从未见过的语法查看代码:

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

# 有什么用?

4

2 回答 2

11

是的,该定义被简单地替换为传递的值。如果您想在编译时确定是否要通过转换函数(#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

于 2012-05-09T11:22:34.573 回答
11

实际上 __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。

于 2012-05-09T11:37:43.063 回答