【问题标题】: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; \
}

# 是什么意思?

【问题讨论】:

    标签: c++ c visual-c++


    【解决方案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

    【讨论】:

    • 感谢您的链接。
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2011-05-27
    • 2020-03-18
    • 2021-08-02
    • 2015-03-24
    • 2018-05-03
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多