宏字符串:#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字符串