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

cks*_*2k2 3 c c++ visual-c++

这是什么意思?

#define __T(x)  x
Run Code Online (Sandbox Code Playgroud)

刚回来x?

我看到代码使用我以前没见过的语法:

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

#for是什么?

Thi*_*ter 10

是的,该定义只是替换为传递的值.如果您想在编译时确定是否要通过转换函数(#define __T(x) translate(x))或不通过()传递值,则通常会使用这种定义#define __T(x) x.

#字符串化传递的值:http://gcc.gnu.org/onlinedocs/cpp/Stringification.html并且
##是串联运算符:http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html


mar*_*inj 8

实际上__T用于将字符串转换为wchar_t*或char*,在tchar.h中你有:

#define __T(x)      L ## x
Run Code Online (Sandbox Code Playgroud)

在启用UNICODE时使用

#define __T(x)      x
Run Code Online (Sandbox Code Playgroud)

当它被禁用时

如果要在UNICODE和非UNICODE编译上编译代码,请使用:

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

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

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

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)
Run Code Online (Sandbox Code Playgroud)

回到你的例子:

strcpy(codecName, __T(#CODEC)); \
Run Code Online (Sandbox Code Playgroud)

相当于:

strcpy(codecName, "CODEC"); \
Run Code Online (Sandbox Code Playgroud)

在非unicode构建,和

strcpy(codecName, L"CODEC"); \
Run Code Online (Sandbox Code Playgroud)

关于UNICODE构建

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